OK, nicht ganz so typisch für's Forum, aber da mit dem Pointer nur an einer Stelle gearbeitet wird, bin ich der Meinung, daß dieses Beispiel einigermaßen selbst erklärend ist:
Code:
[FONT=courier new]FUNCTION FC 4 : VOID
[/FONT][FONT=courier new]TITLE =Ringspeicher[/FONT]
[FONT=courier new]//Für Aufzeichnungszwecke, welche die CPU unmerklich belasten, wurde hier ein [/FONT]
[FONT=courier new]//Ringspeicher programmiert.[/FONT]
[FONT=courier new]//Er speichert bei jeder positiven Flanke an Speichern (z.B. alle X Sekunden) [/FONT]
[FONT=courier new]//einen Messwert (hier Zeit).[/FONT]
[FONT=courier new]//Ist der Messwertspeicher voll geschrieben, so wird der erste Messwert und [/FONT]
[FONT=courier new]//die folgenden wieder erneut beschrieben (überschrieben, FIFO).[/FONT]
[FONT=courier new]VERSION : 0.1[/FONT]
[FONT=courier new]VAR_INPUT[/FONT]
[FONT=courier new] Speichern : BOOL ; [/FONT]
[FONT=courier new] Reset : BOOL ; [/FONT]
[FONT=courier new] Eingangswert : S5TIME ; [/FONT]
[FONT=courier new] DBNr : BLOCK_DB ; [/FONT]
[FONT=courier new] Startbyte : INT ; [/FONT]
[FONT=courier new] Anzahl_Werte : INT ; [/FONT]
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]VAR_IN_OUT[/FONT]
[FONT=courier new] FP_Speichern : BOOL ; //Flankenmerker[/FONT]
[FONT=courier new] Zeigernummer : WORD ; [/FONT]
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new]VAR_TEMP[/FONT]
[FONT=courier new] Impuls_Speichern : BOOL ; [/FONT]
[FONT=courier new] Byteanzahl : INT ; [/FONT]
[FONT=courier new] Zeiger_Bitbereinigt : DWORD ; [/FONT]
[FONT=courier new]END_VAR[/FONT]
[FONT=courier new]
[/FONT]
[FONT=courier new]BEGIN[/FONT]
[FONT=courier new]NETWORK[/FONT]
[FONT=courier new]TITLE =Initialisierung[/FONT]
[FONT=courier new]//Mit Reset (z.B. beim SPS-Start) wird der Speicherstellenzeiger auf den [/FONT]
[FONT=courier new]//Startwert zurückgesetzt.[/FONT]
[FONT=courier new] U #Reset; [/FONT]
[FONT=courier new] SPBN strt; [/FONT]
[FONT=courier new] L #Startbyte; [/FONT]
[FONT=courier new] T #Zeigernummer; [/FONT]
[FONT=courier new]strt: NOP 0; [/FONT]
[FONT=courier new]NETWORK[/FONT]
[FONT=courier new]TITLE =Speichern?[/FONT]
[FONT=courier new]//HIGH/LOW-Abfrage für Speichern[/FONT]
[FONT=courier new] U #Speichern; [/FONT]
[FONT=courier new] FP #FP_Speichern; [/FONT]
[FONT=courier new] = #Impuls_Speichern; [/FONT]
[FONT=courier new] U #Impuls_Speichern; [/FONT]
[FONT=courier new] SPBN ende; [/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]NETWORK[/FONT]
[FONT=courier new]TITLE =Eingangswert im DB abspeichern[/FONT]
[FONT=courier new]//Pointer erzeugen[/FONT]
[FONT=courier new]//Wert an der gezeigten Stelle speichern[/FONT]
[FONT=courier new] L #Zeigernummer; // Bitstelle entfernen[/FONT]
[FONT=courier new] SLW 3; // damit Zugriff auf echte[/FONT]
[FONT=courier new] T #Zeiger_Bitbereinigt; // Speicherstelle erfolgen kann[/FONT]
[FONT=courier new]
[/FONT][FONT=courier new] AUF #DBNr; [/FONT]
[FONT=courier new] L #Eingangswert; // Wert[/FONT]
[FONT=courier new] T DBD [#Zeiger_Bitbereinigt]; // abspeichern[/FONT]
[FONT=courier new]NETWORK[/FONT]
[FONT=courier new]TITLE =Zeiger auf nächsten Wert stellen[/FONT]
[FONT=courier new]
L 2; // Byteanzahl des zu speichernden Wertes[/FONT]
[FONT=courier new] T #Byteanzahl; [/FONT]
[FONT=courier new] L #Zeigernummer; // ZeigerNr. erhöhen[/FONT]
[FONT=courier new] L #Byteanzahl; [/FONT]
[FONT=courier new] +I ; [/FONT]
[FONT=courier new] T #Zeigernummer; [/FONT]
[FONT=courier new]NETWORK[/FONT]
[FONT=courier new]TITLE =Zeiger auf Bereichsüberschreitung prüfen[/FONT]
[FONT=courier new]//Letztes Startbyte berechnen[/FONT]
[FONT=courier new]//Anfangs-Offset hinzufügen[/FONT]
[FONT=courier new]//Mit Zeigernummer vergleichen[/FONT]
[FONT=courier new]//Gf. auf Start rücksetzen[/FONT]
[FONT=courier new] L #Anzahl_Werte; // Letztes Anfangsbyte berechnen[/FONT]
[FONT=courier new] L #Byteanzahl; [/FONT]
[FONT=courier new] *I ; [/FONT]
[FONT=courier new] L #Startbyte; // Startverschiebung[/FONT]
[FONT=courier new] +I ; [/FONT]
[FONT=courier new] L #Zeigernummer; // Abfrage auf Speicherende[/FONT]
[FONT=courier new] <I ; [/FONT]
[FONT=courier new] SPBN ende; [/FONT]
[FONT=courier new]
L #Startbyte; // Rücksetzen[/FONT]
[FONT=courier new] T #Zeigernummer; [/FONT]
[FONT=courier new]NETWORK[/FONT]
[FONT=courier new]TITLE =Schleifen-Ende[/FONT]
[FONT=courier new]ende: NOP 0; [/FONT]
[FONT=courier new]END_FUNCTION[/FONT]
Ich hab'
dieses Beispiel (Ringspeicher) ein bißchen für Dich angepaßt, da original im IDB gespeichert wurde. Ist aber nicht weiter getestet, ich hoffe es haben sich keine Fehler eingeschlichen.
Was ich mit dem Beispiel zeigen wollte - der Zeiger auf das jeweilige Anfangsbyte des nächsten Meßwertes wird einfach als INT berechnet (immer +2 und nur am Schluß geprüft, das der Zeiger nicht zu groß ist).
Der Pointer für's Speichern wird dann nur an einer Stelle durch das SLW richtig erzeugt.
Somit könnte man den ganzen Code sogar mit FUP/KOP erzeugen, allerdings ist die Rechnerei umständlicher.