// PV Daten lesen und aufbereiten
REGION PV
// Daten lesen
REGION PV_Modbus_lesen
// Beim CPU hochfahren und/oder wenn alle Verbindungen aus sind, im Abstand von 2 Sekunden neuen Abfrage Zyklus starten
IF "DB_MB_Client_PV".Busy = FALSE AND "DB_MB_Client_PV".Done = FALSE AND "DB_Time".Clock.Flanke."0,5Hz_Impuls" = TRUE THEN// Smartmeter - Modbus TCP nicht belegt und 2 Sekunden Flanke! für Start
"DB_MB_Client_PV".Start := TRUE;
ELSE
"DB_MB_Client_PV".Start := FALSE;
END_IF;
// MB_Client_SM_Daten lesen!
IF "DB_MB_Client_PV".Schritt = 1 THEN
// Subnetadress vom Smartmeter setzen!
"MB_CLIENT_PV".MB_Unit_ID := "DB_MB_Client_PV".MB_Unit_ID_SM;
// Smartmeter abfragen
"MB_CLIENT_PV"(REQ := "DB_MB_Client_PV".Done OR "DB_MB_Client_PV".Start,
DISCONNECT := "DB_MB_Client_PV".Disconnect,
MB_MODE := "DB_MB_Client_PV".MB_Mode,
MB_DATA_ADDR := "DB_MB_Client_PV".MB_Data_Addr_SM,
MB_DATA_LEN := "DB_MB_Client_PV".MB_Data_Len_SM,
DONE => "DB_MB_Client_PV".Done,
BUSY => "DB_MB_Client_PV".Busy,
ERROR => "DB_MB_Client_PV".Error,
STATUS => "DB_MB_Client_PV".Status,
MB_DATA_PTR := "DB_MB_Client_PV".Holdingregister,
CONNECT := "DB_MB_Client_PV".Fronius_Connect);
// Smartmeter Lesen - Zyklus Counter
REGION Zyklus_Counter_SM
IF "DB_MB_Client_PV".Busy = 1 THEN
"DB_MB_Client_PV".Cyclus_Count_SM := "DB_MB_Client_PV".Cyclus_Count_SM + 1;
ELSE
"DB_MB_Client_PV".Cyclus_Count_SM := 0;
END_IF;
IF "DB_MB_Client_PV".Cyclus_Count_SM > "DB_MB_Client_PV".Cyclus_max_SM THEN
"DB_MB_Client_PV".Cyclus_max_SM := "DB_MB_Client_PV".Cyclus_Count_SM;
END_IF;
END_REGION
// Smartmeter Daten aufbereiten
REGION SM_Daten
// Wenn das Datenlesen vom Smartmeter fertig ist, Daten aufbereiten
IF "DB_MB_Client_PV".Done = TRUE THEN
;// hier die Werte auf den Zielspeicher übergeben
END_IF;
END_REGION
// nächster Schritt in der Abfrage
IF "DB_MB_Client_PV".Done = TRUE THEN
"DB_MB_Client_PV".Schritt := 2;
END_IF;
// MB_Client_WR_Daten lesen!
ELSIF "DB_MB_Client_PV".Schritt = 2 THEN
// Subnetadress vom Wechselrichter setzen!
"MB_CLIENT_PV".MB_Unit_ID := "DB_MB_Client_PV".MB_Unit_ID_WR;
// Wechselrichter abfragen
"MB_CLIENT_PV"(REQ := "DB_MB_Client_PV".Done OR "DB_MB_Client_PV".Start,
DISCONNECT := "DB_MB_Client_PV".Disconnect,
MB_MODE := "DB_MB_Client_PV".MB_Mode,
MB_DATA_ADDR := "DB_MB_Client_PV".MB_Data_Addr_WR,
MB_DATA_LEN := "DB_MB_Client_PV".MB_Data_Len_WR,
DONE => "DB_MB_Client_PV".Done,
BUSY => "DB_MB_Client_PV".Busy,
ERROR => "DB_MB_Client_PV".Error,
STATUS => "DB_MB_Client_PV".Status,
MB_DATA_PTR := "DB_MB_Client_PV".Holdingregister,
CONNECT := "DB_MB_Client_PV".Fronius_Connect);
// Wechselrichter lesen - Zyklus Counter
REGION Zyklus_Counter_WR
IF "DB_MB_Client_PV".Busy = 1 THEN
"DB_MB_Client_PV".Cyclus_Count_WR := "DB_MB_Client_PV".Cyclus_Count_WR + 1;
ELSE
"DB_MB_Client_PV".Cyclus_Count_WR := 0;
END_IF;
IF "DB_MB_Client_PV".Cyclus_Count_WR > "DB_MB_Client_PV".Cyclus_max_WR THEN
"DB_MB_Client_PV".Cyclus_max_WR := "DB_MB_Client_PV".Cyclus_Count_WR;
END_IF;
END_REGION
// Wenn neue Daten vom Wechselrichter kommen, diese aufbereiten
REGION WR_Daten
// Wechselrichter Daten aufbereiten
IF "DB_MB_Client_PV".Done = TRUE THEN
;// hier die Werte auf den Zielspeicher übergeben
END_IF;
END_REGION
// nächster Schritt in der Abfrage
IF "DB_MB_Client_PV".Done = TRUE THEN
"DB_MB_Client_PV".Schritt := 3;
END_IF;
// MB_Client_WR_DC_Daten lesen!
ELSIF "DB_MB_Client_PV".Schritt = 3 THEN
// Subnetadress vom Wechselrichter setzen!
"MB_CLIENT_PV".MB_Unit_ID := "DB_MB_Client_PV".MB_Unit_ID_WR;
// Wechselrichter DC abfragen
"MB_CLIENT_PV"(REQ := "DB_MB_Client_PV".Done OR "DB_MB_Client_PV".Start,
DISCONNECT := "DB_MB_Client_PV".Disconnect,
MB_MODE := "DB_MB_Client_PV".MB_Mode,
MB_DATA_ADDR := "DB_MB_Client_PV".MB_Data_Addr_WR_DC,
MB_DATA_LEN := "DB_MB_Client_PV".MB_Data_Len_WR_DC,
DONE => "DB_MB_Client_PV".Done,
BUSY => "DB_MB_Client_PV".Busy,
ERROR => "DB_MB_Client_PV".Error,
STATUS => "DB_MB_Client_PV".Status,
MB_DATA_PTR := "DB_MB_Client_PV".Holdingregister,
CONNECT := "DB_MB_Client_PV".Fronius_Connect);
// Wechselrichter DC lesen - Zyklus Counter
REGION Zyklus_Counter_WR_DC
IF "DB_MB_Client_PV".Busy = 1 THEN
"DB_MB_Client_PV".Cyclus_Count_WR_DC := "DB_MB_Client_PV".Cyclus_Count_WR_DC + 1;
ELSE
"DB_MB_Client_PV".Cyclus_Count_WR_DC := 0;
END_IF;
IF "DB_MB_Client_PV".Cyclus_Count_WR_DC > "DB_MB_Client_PV".Cyclus_max_WR_DC THEN
"DB_MB_Client_PV".Cyclus_max_WR_DC := "DB_MB_Client_PV".Cyclus_Count_WR_DC;
END_IF;
END_REGION
// Wenn neue DC_Daten vom Wechselrichter kommen, diese aufbereiten
REGION WR_DC_Daten
IF "DB_MB_Client_PV".Done = TRUE THEN
;// hier die Werte auf den Zielspeicher übergeben
END_IF;
END_REGION
// wieder zum ersten Schritt in der Abfrage
IF "DB_MB_Client_PV".Done = TRUE THEN
"DB_MB_Client_PV".Schritt := 1;
END_IF;
END_IF;
END_REGION
END_REGION