Hallo Walter,
ein Erfolgserlebniss mit eurem neuen Baustein Save_Load_Retain.
Nach etwas Umbauen im FBS hat es nun doch ningehauen und ich kann getrostet mit einer USV "PP208 USV Phoenix Contact Quint DC-UPS 24V/10A" arbeiten.
Es hat zwar heute nochmal 3h gedauert bis es so Funtionierte wie es sollte aber das ergebniss kann sich sehen lassen. Er schreibt die Daten wie abgelaufene Zeit seit Start und Schreibt sie auch wieder zurück.
Hier mal eine Version zum Testen zum Baustein.
Code: Select all
FUNCTION_BLOCK RC_Glied
VAR_INPUT
On : BOOL := FALSE; // Einschalten
Off: BOOL := FALSE; // Ausschalten
oldstate : BOOL; // Alter Status
I1 : BOOL; // Eingang 1
I2 : BOOL; // Eingang 2
I3 : BOOL; // Eingang 3
END_VAR
VAR_OUTPUT
Q_On :BOOL; // Ausgang 1 Einschalten
Q_Off:BOOL; // Ausgang 2 Ausschalten
Q_newstate : BOOL; // neuer Status
END_VAR
VAR
END_VAR
Q_On := On or oldstate; // Schalte Ausgang an, wenn schalter auf an oder alter status auf an
// Schalte ausgang aus, wenn Wartung, winterbetrieb, hauptstrom_ok falsch schalter aus gedrückt
Q_Off := (I1 OR I2 OR I3 OR Off );
Q_newstate := oldstate; // alter status auf neuen kopieren
IF ( Q_on ) THEN // wenn an, dann setze neuen status auf an => anlage läuft
Q_newstate := true;
ELSE
Q_Off := TRUE;
return;
END_IF;
IF ( Q_off ) THEN // Wenn aus, dann setze status auf stop, und schalte anlage auf aus
Q_newstate := false;
Q_On := false;
END_IF;
END_FUNCTION_BLOCK
Die
oldstate und
Q_newstate wird mit einer Globale Merker Variable ( RC ) die in Der Retain Variable deklariert sein muss Belegt.
I1 - I3 sind Eingänge die zum Ausschalten benutzen werden können, wie z.b wenn störungen oder Fehler auftreten.
und hier der etwas abgeänderte LOAD_SAVE_RETAIN_DATA Baustein.
Code: Select all
FUNCTION_BLOCK Load_Save_Retain_Data { vNameAlignment := "center"; width := 500; bgColor := "lightblue"; }
VAR_INPUT
WRITE : BOOL; // Zum Schreiben in die Persisten.csv / USV Anschluss oder anderen Schaltkontakt
READ : BOOL;
END_VAR
VAR_OUTPUT
loadRetainRC : UDINT;
saveRetainRC : UDINT;
init : BOOL;
term : BOOL;
nrNonLoaded : INT;
END_VAR
VAR
loadRetainENO : BOOL;
saveRetainENO : BOOL;
END_VAR
RTSCycleInfo ( Init => init, Term => term ); // RTSLoader abfragen ob start und ende
LoadRetainData ( EN := init, fileName := 'Persistent.csv', nrNonLoaded => nrNonLoaded, RC => loadRetainRC, ENO => loadRetainENO );
SaveRetainData ( EN := term, fileName := 'Persistent.csv', RC => saveRetainRC, ENO => saveRetainENO );
if (READ) THEN // Wenn gelesen werden soll !!
LoadRetainData ( EN := init, fileName := 'Persistent.csv', nrNonLoaded => nrNonLoaded, RC => loadRetainRC, ENO => loadRetainENO );
END_IF;
if (WRITE) THEN // Wenn geschrieben werden soll dann schreiben !!
SaveRetainData ( EN := true, fileName := 'Persistent.csv', RC => saveRetainRC, ENO => saveRetainENO );
END_IF;
END_FUNCTION_BLOCK
Gruß
Ingo
wer Fehler findet kann sie ja verbessern und hier posten *fg