-> Hier kostenlos registrieren
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
Egal ist 88.Okay, egal.
Als Quelle schon.Wie siehts jetzt mit Beitrag Nummer #59 aus? Kannst du mir verraten wie ich das anstelle dass der Zeiger zum "Nullen" automatisch alle 5 ms weiterspringt und nullt?
dann solltest Du vlt. noch einen Versuch starten, da es ja wahrscheinlich nur ein kleiner Fehler und nicht die gemeldeten 29 waren!Ich würde es gerne lernen, ...
Ein Grund mehr, noch einen Versuch zu starten... ich würde die Quelle gerne auch sehen, allerdings weiss ich dann wieder nicht wie ich damit umgehe wenn sie beim umsetzen Fehler liefert... Darf ich sie bitte trotzdem sehen? :???:
[FONT=Courier New]FUNCTION_BLOCK "Ereignisspeicher"
TITLE =
VERSION : 0.1
VAR_INPUT
Speichern : BOOL ;
Reset : BOOL ;
Register : BLOCK_DB ;
DS_Laenge : INT ;
DS_Offset : INT ;
DS_Anzahl : INT ;
Reset_Zeit : TIME ;
Uhrzeit : STRUCT
Aktuell_Stunden : BYTE ;
Aktuell_Minuten : BYTE ;
Aktuell_Sekunden : BYTE ;
END_STRUCT ;
END_VAR
VAR
Zeiger_Ringpuffer : INT ;
Ereigniszaehler : INT ;
Schleifenindex : INT ;
FM_Speichern : BOOL ;
FM_Reset : BOOL ;
Reset_Aktiv : BOOL ;
Next_DS : BOOL ;
Reset_Timer : "TON";
END_VAR
VAR_TEMP
Sicherung_AR1 : DWORD ;
Error : INT ;
Start_Reset_Timer : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =
U #Speichern; // IN: BOOL
FP #FM_Speichern; // STATIC: BOOL
SPBN Neu;
AUF #Register; // IN: BLOCK_DB
// Zeiger inkrementieren
L #Zeiger_Ringpuffer; // Zeiger für Ringpuffer (STATIC: INT)
+ 1;
T #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
// Zeiger auf Überlauf prüfen
L #DS_Anzahl; // maximale Anzahl an Datensätzen (IN: INT, Wert 10 über die Schnittstelle übergeben)
L #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
<=I ;
SPBN over;
L 0;
over: T #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
// Ereigniszähler inkrementiern
L #Ereigniszaehler; // Ereigniszähler (STATIC: INT)
+ 1;
T #Ereigniszaehler; // Ereigniszähler
// AR1 sichern
TAR1 ; // AR1 in Akku1 laden
T #Sicherung_AR1; // und im Temp sichern (im Forum so gelernt :), TEMP: DWORD )
// Pointer erstellen
L #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
L #DS_Laenge; // Datensatzlänge (IN: INT, Wert 8 über die Schnittstelle übergeben)
*I ;
L #DS_Offset; // Startadresse des Datenfeldes (IN: INT, Wert 10 über die Schnittstelle übergeben)
+I ;
SLD 3; // berechneten Wert auf die Byteadresse schieben
LAR1 ; // und ins Adressregister 1 schreiben
// Daten eintragen
L #Ereigniszaehler; // Ereigniszähler
T DBW [AR1,P#0.0]; // und wieder sichern
L #Uhrzeit.Aktuell_Stunden; // Aktuelle Stunde (IN: STRUCT.Byte, könnte man auch getrennt übergeben) laden
T DBB [AR1,P#4.0]; // und in Ringpuffer sichern
L #Uhrzeit.Aktuell_Minuten; // Aktuelle Minute (IN: STRUCT.Byte, könnte man auch getrennt übergeben) laden
T DBB [AR1,P#5.0]; // und in Ringpuffer sichern
L #Uhrzeit.Aktuell_Sekunden; // Aktuelle Sekunde (IN: STRUCT.Byte, könnte man auch getrennt übergeben) laden
T DBB [AR1,P#6.0]; // und in Ringpuffer sichern
// AR1 wiederherstellen
L #Sicherung_AR1; // Gesicherten Wert laden
LAR1 ; // und ins AR1 zurückschreiben
// Register ggf. resetten
Neu: U #Reset; // Öffner-Taster
FN #FM_Reset; // deswegen negative Flanke
S #Reset_Aktiv; // Reset aktivieren
S #Next_DS;
U #Next_DS; // Nächsten Datensatz schreiben?
SPBN ende; // Nein, dann zum Ende springen
AUF #Register; // IN: BLOCK_DB
// AR1 sichern
TAR1 ; // AR1 in Akku1 laden
T #Sicherung_AR1; // und im Temp sichern
// Zeiger Ringpuffer initialiesieren
T #Schleifenindex; // als Schleifenindex speichern
T #Zeiger_Ringpuffer; // als Zeiger für Ringpuffer speichern
// Pointer erstellen
L #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
L #DS_Laenge; // Datensatzlänge
*I ;
L #DS_Offset; // Startadresse des Datenfelde
+I ;
SLD 3; // berechneten Wert auf die Byteadresse schieben
LAR1 ; // und ins Adressregister 1 schreiben
// Daten eintragen
L 0; // Wert 0
T DBD [AR1,P#0.0]; // ins 1. DWORD eintragen
L 0; // Wert 0
T DBD [AR1,P#4.0]; // ins 2. DWORD eintragen
// Zeiger erhöhen
L #Schleifenindex; // Schleifenzähler laden,
+ 1; // um 1 erhöhen
T #Schleifenindex; // und wieder speichern
L #DS_Anzahl; // Max. Anzahl an Datensätzen laden
>I ; // Wenn überschritten,
SPBN ARWH;
R #Reset_Aktiv; // RESET deaktivieren
L 0; // Schleifenindex auf Null zurückstellen
T #Schleifenindex;
// AR1 wiederherstellen
ARWH: L #Sicherung_AR1; // Gesicherten Wert laden
LAR1 ; // und ins AR1 zurückschreiben
ende: NOP 0;
// Startbedingungen Reset-Timer
U #Reset_Aktiv;
UN #Next_DS; // Nach nächstem Datensatz schreiben
= #Start_Reset_Timer; // Timer neu starten
// RESET-Timer (Timer sollten möglichst nie übersprungen werden!)
CALL #Reset_Timer (// Timer aufrufen
IN := #Start_Reset_Timer,
PT := #Reset_Zeit,
Q := #Next_DS);
END_FUNCTION_BLOCK[/FONT]
Den Aufruf des SFB4 kannst Du wieder löschen. Da ging es nur darum, das der in die Bausteinliste und in die Symbolliste eingetragen wird, damit Du den SFB in der Quelle benutzen kannst... jetzt muss ich nur noch wissen was ich hier -> Anhang anzeigen 21369 in die fehlenden Felder eintragen muss ...
Jetzt möchte ich allerdings den "Zeiger_Ringpuffer" nicht in meinem FB105 laden, sondern in meinem DB3 "Register" auf der zweiten Stelle -> Anhang anzeigen 21386 .
Ich weiss nicht wie ich euch das erklären soll, aber ich hoffe ihr versteht was ich meine.
Allerdings läuft alles gut bis ich Reset drücke, dann wird der erste Eintrag genullt und das wars. Drücke ich wieder auf meinen Taster um einen Eintrag zu schreiben, überschreibt es immer nur den ersten Eintrag wieder...
Warum nur? Das soll nicht sein, ich will ja alle 5ms, vom ersten Eintrag an, Einträge löschen und wenn er bei Eintrag 2000 angekommen ist soll das Resetten stoppen bis es wieder betätigt wird...
Bitte zurück zu diesem Problem oder ich muss die CPU :sw13:
Vielleicht wirst du einfach mal den Code Posten müssen oder wenigstens den stand
bekanntgeben mit den du gerade arbeitest, ansonsten wird es schwer mit der Hilfe.
U #Speichern // IN: BOOL
FP #FM_Speichern // STATIC: BOOL
SPBN Neu
L "Uhrzeit".Aktuell_Stunden
T #Temp_akt_h
L "Uhrzeit".Aktuell_Minuten
T #Temp_akt_m
L "Uhrzeit".Aktuell_Sekunden
T #Temp_akt_s
AUF #Register // IN: BLOCK_DB
// Zeiger inkrementieren
L "Register".Zeiger_Ringpuffer // Zeiger für Ringpuffer (STATIC: INT)
+ 1
T "Register".Zeiger_Ringpuffer // Zeiger für Ringpuffer
// Zeiger auf Überlauf prüfen
L #DS_Anzahl // maximale Anzahl an Datensätzen (IN: INT, Wert 10 über die Schnittstelle übergeben)
L "Register".Zeiger_Ringpuffer // Zeiger für Ringpuffer
<=I
SPBN over
L 0
over: T "Register".Zeiger_Ringpuffer // Zeiger für Ringpuffer
// Ereigniszähler inkrementiern
L #Ereigniszaehler // Ereigniszähler (STATIC: INT)
+ 1
T #Ereigniszaehler // Ereigniszähler
// AR1 sichern
TAR1 // AR1 in Akku1 laden
T #Sicherung_AR1 // und im Temp sichern (TEMP: DWORD )
// Pointer erstellen
L "Register".Zeiger_Ringpuffer // Zeiger für Ringpuffer
L #DS_Laenge // Datensatzlänge (IN: INT, Wert 8 über die Schnittstelle übergeben)
*I
L #DS_Offset // Startadresse des Datenfeldes (IN: INT, Wert 10 über die Schnittstelle übergeben)
+I
SLD 3 // berechneten Wert auf die Byteadresse schieben
LAR1 // und ins Adressregister 1 schreiben
// Daten eintragen
L #Ereigniszaehler // Ereigniszähler
T DBW [AR1,P#0.0] // und wieder sichern
L #Temp_akt_h // Aktuelle Stunde
T DBB [AR1,P#4.0] // und in Ringpuffer sichern
L #Temp_akt_m // Aktuelle Minute
T DBB [AR1,P#5.0] // und in Ringpuffer sichern
L #Temp_akt_s // Aktuelle Sekunde
T DBB [AR1,P#6.0] // und in Ringpuffer sichern
// AR1 wiederherstellen
L #Sicherung_AR1 // Gesicherten Wert laden
LAR1 // und ins AR1 zurückschreiben
// Register ggf. resetten
Neu: U #Reset // Öffner-Taster
FN #FM_Reset // deswegen negative Flanke
S #Reset_Aktiv // Reset aktivieren
S #Next_DS
U #Next_DS // Nächsten Datensatz schreiben?
SPBN ende // Nein, dann zum Ende springen
AUF #Register // IN: BLOCK_DB
// AR1 sichern
TAR1 // AR1 in Akku1 laden
T #Sicherung_AR1 // und im Temp sichern
// Zeiger Ringpuffer initialisieren
T #Schleifenindex // als Schleifenindex speichern
T "Register".Zeiger_Ringpuffer // als Zeiger für Ringpuffer speichern
// Pointer erstellen
L "Register".Zeiger_Ringpuffer // Zeiger für Ringpuffer
L #DS_Laenge // Datensatzlänge
*I
L #DS_Offset // Startadresse des Datenfelde
+I
SLD 3 // berechneten Wert auf die Byteadresse schieben
LAR1 // und ins Adressregister 1 schreiben
// Daten eintragen
L 0 // Wert 0
T DBD [AR1,P#0.0] // ins 1. DWORD eintragen
L 0 // Wert 0
T DBD [AR1,P#4.0] // ins 2. DWORD eintragen
// Zeiger erhöhen
L #Schleifenindex // Schleifenzähler laden,
+ 1 // um 1 erhöhen
T #Schleifenindex // und wieder speichern
L #DS_Anzahl // Max. Anzahl an Datensätzen laden
>I // Wenn überschritten,
SPBN ARWH
R #Reset_Aktiv // RESET deaktivieren
L 0 // Schleifenindex auf Null zurückstellen
T #Schleifenindex
// AR1 wiederherstellen
ARWH: L #Sicherung_AR1 // Gesicherten Wert laden
LAR1 // und ins AR1 zurückschreiben
ende: NOP 0
// Startbedingungen Reset-Timer
U #Reset_Aktiv
UN #Next_DS // Nach nächstem Datensatz schreiben
= #Start_Reset_Timer // Timer neu starten
// RESET-Timer (Timer sollten möglichst nie übersprungen werden!)
CALL #Reset_Timer // Timer aufrufen
IN:=#Start_Reset_Timer
PT:=#Reset_Zeit
Q :=#Next_DS
ET:=
Wir verwenden essentielle Cookies, damit diese Website funktioniert, und optionale Cookies, um den Komfort bei der Nutzung zu verbessern.
Siehe weitere Informationen und konfiguriere deine Einstellungen