Pointer fortlaufend - könnte ein bissel hilfe gebrauchen

Bob137

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi erstmal alle zusammen

Okey ich steh vor Folgender AUfgabe

Ich möchte bei einer Maschiene die Belichtungszeit dokumentieren (Kundenwunsch)

Über einen Zeitbaustein messe ich die zeit und schreibe sie in einen DB
jetzt brauche ich aber für jeden neuen Zyklus einen neuen platz im DB
ich muss also die Position um "1" Quasie plus machen (+ 2 Bytes)

leider habe ich keine ahnung von awl und das mit dem pointer verstehe ich nicht so richtig

Es gibst zware einen lösung mit SFC20, aber der will zu viel arbeitsspeicher -

Es geht um ca 17 000 werte Pro tag

ich hoffe ihr könnt mir mit dem Pointer weiterhelfen ,so das ich das verstehe
 
nein ist keine gaudi ,habe halt 2 und vetausche sie jetzt nach dem ich den anderen wieder entdeckt habe immer wieder :-D

go back

ich verstehe es nicht wirklich

AUF #Datenbaustein //Typ: Block_DB (hier rufe ich meinen datenbaustein auf z.b.DB400)
L #Datenende //Typ: INT (? was ist genau mit dem gemeint)
L 1 (warum wird hier 1 minus gemacht )
-I
T #index //Typ: DINT
anf: NOP 0 //Schleifenanfang
L #index
SLD 3 //pointer erzeugen
LAR1 //in das Adressregister laden
L DBB [AR1,P#0.0] (okey jetzt ist der pointer geladen)
T DBB [AR1,P#1.0] (warum das noch mal????)
L #index
L 1
-I //Index um 1 verringern (wieder minus 1 warum)
T #index
L 1 (und wieder 1 plus ??????)
+I
L #Datenanfang //Typ: INT (datenanfang ?)
<=I //prüfen ob fertig
SPB ende //wenn ja ende
SPA anf //sonst schleife wiederholen
ende: NOP 0
L #Eintrag //Typ: BYTE (hier wird jetzt mein wert in den db400 geschrieben wenn
der jetzt offen wär)
T DBB [AR1,P#0.0] //neues byte eintragen




Okey mir ist klar ich bin ein schwere fall
aber leuts ich brauch eure hilfe , ich muss einen speicher basteln der in jeden neuen zyklus einen neuen s5t#TIME speichern tut
es sollte auch ein vegleich drin sein damit er nur weiter hopst wenn auch ein wert geschrieben ist
 
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_Pointerformat : 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;         // Startbytenummer[/FONT]
[FONT=courier new]      SLD   3;                     // auf Bytestelle im Pointer verschieben[/FONT]
[FONT=courier new]      T     #Zeiger_[/FONT][FONT=courier new]Pointerformat;[/FONT][FONT=courier new] // [/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]      AUF   #DBNr; [/FONT]
[FONT=courier new]      L     #Eingangswert;               // Wert[/FONT]
[FONT=courier new]      T     DBW [#Zeiger_[/FONT][FONT=courier new]Pointerformat[/FONT][FONT=courier new]]; // 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.
 
Zuletzt bearbeitet:
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.

Wenn ich anmerken darf, nimm bitte SLD statt SLW, bei großen Db geht das sonst irgendwann nicht mehr, wie ich aus eigener Erfahrung sagen darf. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich anmerken darf, nimm bitte SLD statt SLW, bei großen Db geht das sonst irgendwann nicht mehr, wie ich aus eigener Erfahrung sagen darf. ;)
Ich hab's geändert.
Ich glaube, das geht bei den geforderten 17.000 schon schief, wenn ich die Bits richtig gezählt habe. (Das verlinkte Beispiel ging nur bis 500.)
Also danke!
 
Nur mal so als Anmerkung!

Ich lese hier in ganz vielen Beiträgen : "Bitstelle entfernen"

Code:
[FONT=courier new][FONT=courier new]  VAR_IN_OUT[/FONT]
[FONT=courier new]    Zeigernummer : WORD ; [/FONT]
[FONT=courier new]  END_VAR[/FONT] [/FONT]

[FONT=courier new]  L #Zeigernummer; // Bitstelle entfernen[/FONT]
[FONT=courier new]  SLD 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]
Fakt ist aber, es wird keine Bitstelle entfernt sonder das SLD3 dient als Platzhalter für die 3 Bitstellen.
Denn Zeigernummer ist nur eine Wordadresse und beinhaltet keine Bits.
Als Zeiger für die Indirekte Adressierung muss die Speicherstelle aber Byte und Bit enthalten, darum wird die Bitstelle der Byteadresse zugefügt.

PS: Sollte keine Kritik sein, absolut prima hilfe Hucki :D
 
Nein, das ist gut so.

Ich arbeite selbst eigentlich nur mit der S7-200 und nutze diese Fragen immer zum Selbstlernen. Das Beispiel ist ja auch nicht von mir, sondern ich hab's nur ein bißchen angepaßt. Was mir hier eben auffiel, das man den Pointer nur an einer Stelle benötigt, und sonst nur "normal" mit INT rechnet.

Wie so oft ist es also viel einfacher, als man es sich zu Beginn vorgestellt hat.


Jetzt hoff' ich nur, daß ich bei der Korrektur keine neuen "Fehler" rein gebracht habe (habe den Namen des Pointers auch selbsterklärender gemacht).
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Leuts DANKE

ich konnte leider die letzten tage nicht antworten

werde es gleich ausprobieren und hoffe wenn das nächste mal jemand nach sowas fragt das ich ihn dann aus der pasche helfen kann

Ihr seit super
 
Zuletzt bearbeitet:
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_Pointerformat : 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;         // Startbytenummer[/FONT]
[FONT=courier new]     SLD   3;                     // auf Bytestelle im Pointer verschieben[/FONT]
[FONT=courier new]     T     #Zeiger_[/FONT][FONT=courier new]Pointerformat;[/FONT][FONT=courier new] // [/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]     AUF   #DBNr; [/FONT]
[FONT=courier new]     L     #Eingangswert;               // Wert[/FONT]
[FONT=courier new]     T     DBD [#Zeiger_[/FONT][FONT=courier new]Pointerformat[/FONT][FONT=courier new]]; // 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]

Okey habs jetzt getestet habe aber jetzt fogendes Problem, die flanke habe ich jetzt mal raus genommen, Ich habe jetzt mal die Byte anzahl auf 1000 zum testen gestellt

Eingangswert = ST5#5S
Startbyte = 0
DBNr = DB401
Anzahl_Werte = 1000

- also -
sobald er ein wert speichert z.b S5t#5s in 2.0
und er im nächsten zyklus auf 4.0 springt und da den wert speichert ,
setzt er aber vorher den wert in 2.0 zurück
und läuft dann bis 256.0 und nur da speichert er den wert dauerhaft
sobald er 256.0 erreicht hat start er von vorne

-warum-
warum wird mein wert wieder auf 0 gesetzt ????
 
Hallo Kollege,
also erstens: ist die Flanke Kommentiert:

NETWORK
TITLE =Speichern?
//HIGH/LOW-Abfrage für Speichern
U #Speichern;
// FP #FP_Speichern;
= #Impuls_Speichern;

U #Impuls_Speichern;
SPBN ende;

und dann arbeitet die FC mit Doppelword, und nicht mit Word:
AUF #DBNr;
L #Eingangswert; // Wert
T DBD [#Zeiger_Pointerformat]; // abspeichern

Mach die Flanke wieder rein, und anstatt DBD -> DBW, dann ist es ok.

gruss: Vl.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 : DINT ;    [/FONT]
[FONT=courier new]Anzahl_Werte : DINT ;    [/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 : DWORD ;    [/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_Pointerformat : 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]   =     #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;         // Startbytenummer[/FONT]
[FONT=courier new]   SLD   3;                     // auf Bytestelle im Pointer verschieben[/FONT]
[FONT=courier new]   T     #Zeiger_[/FONT][FONT=courier new]Pointerformat;[/FONT][FONT=courier new] // [/FONT]
[FONT=courier new]
[/FONT][FONT=courier new]   AUF   #DBNr; [/FONT]
[FONT=courier new]   L     #Eingangswert;               // Wert[/FONT]
[FONT=courier new]   T     DBW [#Zeiger_[/FONT][FONT=courier new]Pointerformat[/FONT][FONT=courier new]]; // 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]   +D    ; [/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]   *D    ; [/FONT]
[FONT=courier new]   L     #Startbyte; // Startverschiebung[/FONT]
[FONT=courier new]   +D    ; [/FONT]
[FONT=courier new]   L     #Zeigernummer; // Abfrage auf Speicherende[/FONT]
[FONT=courier new]   <D   ; [/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]


Danke vladi funktioniert jetzt

ist zum haare raufen das ich das nicht bemerkt habe , aber ist klar ,dass beim DWORT ein WORT dann überschrieben wird.
Das mit der Flanke ist gewollt - habe sie jetzt mal ganz raus genommen - sieht jetzt zwar unnötig aus das netztwerk ist aber okey

habe jetzt nur noch mal alle INT in DINT gewandelt - den mit INT komme ich ja nur auf 256 Bytes ,beötige aber ca 17000


Danke an alle, war zwar eine schwere Geburt

Bin aber jetzt ein bissel schlauer:p
 
Zuletzt bearbeitet:
Na, also.. wooobei ohne die Flanke funktioniert das Ganze nicht..
Es sei denn, deine FC Eingangsvariable "Speichern" ist schon eine Flanke..sonst ist Salat... :ROFLMAO:

Vl.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja habe die Eingangsvariable "Speichern" alls flanke genommen

nja ich brauch ja mehr als 255 Byts ----> brauch platz für ca 17000 werte (2 Bytes pro wert) nicht für 17000 Bytes sorry:rolleyes:
Daher 34000 Bytes

:ROFLMAO:
 
Zuletzt bearbeitet:
...
und dann arbeitet die FC mit Doppelword, und nicht mit Word:
AUF #DBNr;
L #Eingangswert; // Wert
T DBD [#Zeiger_Pointerformat]; // abspeichern
hab' ich glatt übersehen, sorry.:oops:



Code:
[FONT=courier new]...[/FONT][FONT=courier new]
[/FONT][FONT=courier new]VAR_IN_OUT[/FONT]
[FONT=courier new]FP_Speichern : BOOL ;    //Flankenmerker [COLOR=#ff0000]<- Zeile kann gelöscht werden[/COLOR][/FONT]
[FONT=courier new]Zeigernummer : DWORD ;    [/FONT]
[FONT=courier new]END_VAR[/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]   =     #Impuls_Speichern; [/FONT][COLOR=#FF0000][FONT=courier new]<- Zeile kann gelöscht werden[/FONT][/COLOR]

[FONT=courier new]   U     #Impuls_Speichern; [/FONT][COLOR=#FF0000][FONT=courier new]<- Zeile kann gelöscht werden[/FONT][/COLOR]
[FONT=courier new]   SPBN  ende; [/FONT]
[FONT=courier new]...[/FONT]
Da kannst du noch 'n bißchen rauslöschen, wenn du die Flanke jetzt außen an den FC legst.



...habe jetzt nur noch mal alle INT in DINT gewandelt - den mit INT komme ich ja nur auf 256 Bytes ,beötige aber ca 17000
...
Also ich komme auf 32768 Bytes und damit 16384 Werte (unsigned sogar das doppelte), aber das sind natürlich nur fast 17.000 und nicht circa.


Aber was viel wichtiger ist - offensichtlich hast Du die ganze Vorgehensweise verstanden.
:s1:
 
Leuts danke

Schwere Geburt :ROFLMAO:

aber jetzt ist das Kind da und heist FB10-DB10

von meiner Seite aus schließe ich mal jetzt das ganze hier

= ausser jemand ist neu hier und hat noch fragen (forum ist echt klasse)



----------------------------------------------CLOSE----------------------------------------------
 
Zurück
Oben