Pointer und Schieber

A

Anonymous

Guest
Zuviel Werbung?
->Hier kostenlos registrieren
Halli Hallo,
ich habe kleine Probleme im Moment.
Ich habe Daten auf DB gespeichert und möchte, dass nach einer bestimmte Zeit, wenn ich neue Daten bekomme, werden die Alte Daten nicht überschreiben sonder geschoben. Ich möchte keine daten verloren.
Mein Problem ist: ich kenne mich nicht so gut mit Pointer und Schieber und ich weiss nicht so genau wie ich das realizieren kann :oops: .
kennten jemand mir helfen???
Danke![/img]
 

volker

Supermoderator
Teammitglied
Beiträge
5.468
Punkte Reaktionen
935
hier mal ein baustein mit dem man sowas machen könnte.
wenn oben ein neuer wert eingetragen wird wird unten der letzte rausgeschoben.

diesen baustein habe ich mal für s5 geschrieben, funktioniert aber auch in einer s7.

das erste nutzdatenwort ist dw 3. die oberen werden intern benötigt.

Code:
Netzwerk 1                   Ein Wort in Fifo speichern       FUP Ausgabe
Name :FIFO-EIN
Bez  :EINT      E/A/D/B/T/Z: E  BI/BY/W/D: BI
Bez  :FIDB      E/A/D/B/T/Z: B
Bez  :DADB      E/A/D/B/T/Z: B
Bez  :FLAN      E/A/D/B/T/Z: A  BI/BY/W/D: BI
Bez  :IMPU      E/A/D/B/T/Z: A  BI/BY/W/D: BI
Bez  :DATE      E/A/D/B/T/Z: E  BI/BY/W/D: W
Bez  :NUWO      E/A/D/B/T/Z: D  KM/KH/KY/KC/KF/KT/KZ/KG: KF

     :L   KC C
     :L   KY 10,2                              EINT=Daten eintragen anstossen
     :L   KH 2000                              FIDB=FIFO-DB
     :L   KC BY                                DADB=Daten-DB
     :L   KC VL                                FLAN=Flankenmer.zum Daten eintr.
     :                                         IMPU=Impulsmer.zum Daten eintr.
     :                                         DATE=Daten zum ablegen
     :                                         NUWO=Anzahl der Nutzworte
     :***


Netzwerk 2                                                    FUP Ausgabe
     :AWL
     :UN  =EINT                                Daten eintragen anstossen
     :RB  =FLAN                                Flankenmerker ruecksetzen
     :U   =EINT
     :UN  =FLAN
     :S   =FLAN
     :=   =IMPU                                Impulsmerker
     :
     :UN  =IMPU
     :SPB =M001
     :
     :B   =DADB                                Daten - DB
     :L   =DATE                                Daten zum abspeichern
     :T   MW 202
     :
     :B   =FIDB                                fifo-db
     :LW  =NUWO                                Anzahl nutzworte
     :L   KF +2                                endadresse -1 erzeugen
     :+F
     :T   MW 200                               index
     :
M002 :L   MW 200                               lade index dw x
     :T   DW   0
     :B   DW   0
     :L   DW   0                               lade dw x
     :T   DW   1                               zwischenspeichern in dw1
     :L   MW 200
     :L   KF +1
     :+F                                       erzeuge index +1
     :T   DW   0                               neuer index
     :L   DW   1                               zwischengespeichertes dw x
     :B   DW   0
     :T   DW   0                               im neuen index speichern
     :
     :L   MW 200                               index -1
     :L   KF +1
     :-F
     :T   MW 200
     :L   MW 200
     :L   KF +2                                erstes nutzwort erreicht
     :><F
     :SPB =M002                                sprung bei nein
     :L   MW 202                               ablagedaten
     :T   DW   3                               im dw 3 speichern
M001 :BE

mfg
 

Ulrich Klakow

Member
Beiträge
18
Punkte Reaktionen
0
FIFO verwenden

Hallo Zeus,

dazu braucht man einen FIFO. Wenn deine Einträge Byte/Word oder DWord lang sind, hast du Glück gehabt, sowas gibt (oder gab?) es
schon mal in der S7-Bibliotek. Hast du aber größere Einträge, so
bleibt dir nichts anderes übrig diesen FIFO selber zu schreiben
oder zu fragen ob jemand so einen Baustein schon geschrieben hat.
Leider gibt es derzeit in dem Forum keine Möglichkeit freie Bausteine (unter z.B.) GPL ins Netz zu stellen :( schade.
Siemens bietet einen FIFO auch über seine kostenpflichtigen Dienst an.
Wir haben sollch einen Baustein letztes Jahr mal gekauft, hatten aber nur
Probleme damit.
 
OP
A

Anonymous

Guest
Geht nicht!

volker schrieb:
hier mal ein baustein mit dem man sowas machen könnte.
wenn oben ein neuer wert eingetragen wird wird unten der letzte rausgeschoben.

diesen baustein habe ich mal für s5 geschrieben, funktioniert aber auch in einer s7.

das erste nutzdatenwort ist dw 3. die oberen werden intern benötigt.

Code:
Netzwerk 1                   Ein Wort in Fifo speichern       FUP Ausgabe
Name :FIFO-EIN
Bez  :EINT      E/A/D/B/T/Z: E  BI/BY/W/D: BI
Bez  :FIDB      E/A/D/B/T/Z: B
Bez  :DADB      E/A/D/B/T/Z: B
Bez  :FLAN      E/A/D/B/T/Z: A  BI/BY/W/D: BI
Bez  :IMPU      E/A/D/B/T/Z: A  BI/BY/W/D: BI
Bez  :DATE      E/A/D/B/T/Z: E  BI/BY/W/D: W
Bez  :NUWO      E/A/D/B/T/Z: D  KM/KH/KY/KC/KF/KT/KZ/KG: KF

     :L   KC C
     :L   KY 10,2                              EINT=Daten eintragen anstossen
     :L   KH 2000                              FIDB=FIFO-DB
     :L   KC BY                                DADB=Daten-DB
     :L   KC VL                                FLAN=Flankenmer.zum Daten eintr.
     :                                         IMPU=Impulsmer.zum Daten eintr.
     :                                         DATE=Daten zum ablegen
     :                                         NUWO=Anzahl der Nutzworte
     :***


Netzwerk 2                                                    FUP Ausgabe
     :AWL
     :UN  =EINT                                Daten eintragen anstossen
     :RB  =FLAN                                Flankenmerker ruecksetzen
     :U   =EINT
     :UN  =FLAN
     :S   =FLAN
     :=   =IMPU                                Impulsmerker
     :
     :UN  =IMPU
     :SPB =M001
     :
     :B   =DADB                                Daten - DB
     :L   =DATE                                Daten zum abspeichern
     :T   MW 202
     :
     :B   =FIDB                                fifo-db
     :LW  =NUWO                                Anzahl nutzworte
     :L   KF +2                                endadresse -1 erzeugen
     :+F
     :T   MW 200                               index
     :
M002 :L   MW 200                               lade index dw x
     :T   DW   0
     :B   DW   0
     :L   DW   0                               lade dw x
     :T   DW   1                               zwischenspeichern in dw1
     :L   MW 200
     :L   KF +1
     :+F                                       erzeuge index +1
     :T   DW   0                               neuer index
     :L   DW   1                               zwischengespeichertes dw x
     :B   DW   0
     :T   DW   0                               im neuen index speichern
     :
     :L   MW 200                               index -1
     :L   KF +1
     :-F
     :T   MW 200
     :L   MW 200
     :L   KF +2                                erstes nutzwort erreicht
     :><F
     :SPB =M002                                sprung bei nein
     :L   MW 202                               ablagedaten
     :T   DW   3                               im dw 3 speichern
M001 :BE

mfg

Dieses Programm funktioniert aber nicht in S7, da es dort keine "Bearbeite"-Befehl mehr gibt!
 

volker

Supermoderator
Teammitglied
Beiträge
5.468
Punkte Reaktionen
935
Zuviel Werbung?
->Hier kostenlos registrieren
Re: Geht nicht!

Dieses Programm funktioniert aber nicht in S7, da es dort keine "Bearbeite"-Befehl mehr gibt!

ok ok
er wird denn so kleinlich sein. :wink: das kann man doch ohne probs mal eben in s7 konvertieren lassen.

dann sieht das so aus.
Code:
deklaration:
in:
EINT	BOOL		 EINT	
FIDB	BLOCK_DB		 FIDB	
DADB	BLOCK_DB		 DADB	
_DATE	WORD		 DATE	
NUWO	INT		 NUWO	
out:
FLAN	BOOL		 FLAN	
IMPU	BOOL		 IMPU	
temp:
conv_akku1	DWORD			
conv_akku2	DWORD			
conv_stw	WORD			


      UN    #EINT                       // Daten eintragen anstossen
      R     #FLAN                       // Flankenmerker ruecksetzen
      U     #EINT
      UN    #FLAN
      S     #FLAN
      =     #IMPU                       // Impulsmerker
//;
      UN    #IMPU
      SPB   M001
//;
      AUF   #DADB                       // Daten - DB
      L     #_DATE                      // Daten zum abspeichern
      T     MW   202
//;
      AUF   #FIDB                       // fifo-db
      L     #NUWO                       // Anzahl nutzworte
      L     2                           // endadresse -1 erzeugen
      +I    
      T     MW   200                    // index
//;
M002: L     MW   200                    // lade index dw x
      T     DBW    0

      T     #conv_akku1
      L     STW
      T     #conv_stw
      L     DBB    1
      SLW   4
      LAR1  
      L     #conv_stw
      T     STW
      L     #conv_akku1
      L     DBW [AR1,P#0.0]             // lade dw x
      T     DBW    2                    // zwischenspeichern in dw1
      L     MW   200
      L     1
      +I                                // erzeuge index +1
      T     DBW    0                    // neuer index
      L     DBW    2                    // zwischengespeichertes dw x

      T     #conv_akku1
      TAK   
      T     #conv_akku2
      L     STW
      T     #conv_stw
      L     DBB    1
      SLW   4
      LAR1  
      L     #conv_stw
      T     STW
      L     #conv_akku2
      L     #conv_akku1
      T     DBW [AR1,P#0.0]             // im neuen index speichern
//;
      L     MW   200                    // index -1
      L     1
      -I    
      T     MW   200
      L     MW   200
      L     2                           // erstes nutzwort erreicht
      <>I   
      SPB   M002                        // sprung bei nein
      L     MW   202                    // ablagedaten
      T     DBW    6                    // im dw 3 speichern
M001: NOP   0

mfg
 

sps-concept

Well-known member
Beiträge
2.235
Punkte Reaktionen
249
"FIFO"

Für grössere Datenblöcke hab ich was ganz elegantes.
-> http://www.sps-concept.de/download/print/dat_reg.pdf
Damit kann man beispielsweise auf den x.Satz im Datenregister zugreifen. Die Satzgrösse richtet sich nach der einzutragenden/auszulesenenden Variable. Es wird überwacht ob der DB lang genug ist usw. Eingesetzt habe ich diesen Baustein u.a. folgendermassen:

1. * Seriennummern von Fertigungsteilen werden täglich hochgezählt. Zu diesen Seriennummern werden an mehreren Bearbeitungsstellen die Qualitätsdaten in das Datenregister eingetragen... Seriennummer = Satznummer. Am Ende der Produktionslinie werden diese passend zum Teil ausgelesen und dementsprechend sortiert. Über die HMI-Oberfläche können die daten ebenfalls ausgelesen werden.

2. * Anlagenkonfigurationen von 300 Byte (!) sind in einem DB eingetragen. Diese können angewählt werden und werden zum aktivieren in einen Merkerbereich geschrieben. Ebenso können diese bearbeitet und rückgeschrieben werden.

Beispielsweise könnten also diese Daten in den DB eingetragen werden. Satz 1...99. Bei 99 angekommen gehts wieder bei 1 los.

MfG
André Räppel
 
OP
A

Anonymous

Guest
Zeus schrieb:
Halli Hallo,
ich habe kleine Probleme im Moment.
Ich habe Daten auf DB gespeichert und möchte, dass nach einer bestimmte Zeit, wenn ich neue Daten bekomme, werden die Alte Daten nicht überschreiben sonder geschoben. Ich möchte keine daten verloren.
Mein Problem ist: ich kenne mich nicht so gut mit Pointer und Schieber und ich weiss nicht so genau wie ich das realizieren kann :oops: .
könnten jemand mir helfen???
Danke![/img]
 
Oben