Schieberegister mit UDT's

A

Anonymous

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Habe ein Schieberegister mit UDT-Datensätzen.
Womit kann/soll ich jetzt die Datensätze weiterschieben?
Mit SFC20 und ANY-Pointern?
Oder kann man das Ganze einfach auch Wortweise mit Pointern
(mit UDT-entsprechenden Versatz) nach unten schieben?

Danke
Maxdo
 
Kommt darauf an, wie groß Dein UDT ist. Mit dem SFC BLK_MOV und ANY-Pointern hab ich bisher keine Probleme gehabt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich weiß ja nicht wie groß dein sr ist, aber ich halte nix davon datensätze durchzuschieben. weil es eigentlich unnötig kompliziert und später sehr unflexibel ist. auserdem wird dich die steuerung dafür hassen weil die zykluszeit stark ansteigt...

ich würde die datensäzte lassen wo sie sind, und nur die pointer die eintragen und auslesen dynamisch machen...

ist dann quasi ein ringspeicher
 
Das SR ist "relativ" groß... ca. 10-15 kB.
Die Daten des abgelaufenen Tages werden in einem UDT
zusammengefasst und im SR abgelegt.

Da die Datensätzte später ausgewertet werden (Wochenauswertung)
dachte ich es ist (der Übersichtlichkeit wegen) einfacher die
Datensätzte weiterzuschieben... z.B. vorgestern = 3.Datensatz

Wie komme ich beim Ringspeicher wenn zb. aktueller Scheibezeiger
auf 5.Datensatz und ich will die Position von "akt. Datum -7 Tage" errechnen?

danke
maxdo
 
FIFO für Datenblöcke

hier mal ein fc der genau das macht was du willst.
anzahl der blöcke, blockgrösse etc sind einstellbar

dies ist eine quelle.
Code:
FUNCTION FC 98 : INT
TITLE = FIFO für Datenblöcke V1.00 von V.Lischnewski (siehe Kommentar)
//FIFO für Datenblöcke
//Beispiel: Blöcke=4; Länge pro Block=2 byte
//
//ziel            __\ byte1 \________________
//               |  / byte2 /                |
//               |    byte3 \_________    /__|3.
//               |    byte4 /         |   \
//               |    byte5 \__    /__|2.
//               |    byte6 /  |   \
//               |    byte7 /__|1.
//               |    byte8 \
//               |
//               |
//quelle       4.|__/ byte1
//                  \ byte2
//
//Ablauf: 
//1. zielbyte 5/6 wird nach zielbyte 7/8 kopiert
//2. zielbyte 3/4 wird nach zielbyte 5/6 kopiert
//3. zielbyte 1/2 wird nach zielbyte 3/4 kopiert
//4. quellbyte 1/2 wird nach zielbyte 1/2 kopiert
AUTHOR : Lischnew
FAMILY : ARCHIV
NAME : FIFO_Blk
VERSION : 1.0


VAR_INPUT
  Quelle_DB : INT ;	//Quelle Datenbaustein
  Quelle_Anfang : INT ;	//Quelle Anfangsadresse
  Blockgroesse : INT ;	//Anzahl Bytes pro Datenblock
  Anzahl_Bloecke : INT ;	//Anzahl der Datenblöcke
  Ziel_DB : INT ;	//Ziel Datenbaustein
  Ziel_Anfang : INT ;	//Ziel Anfangsadresse
END_VAR
VAR_TEMP
  QANY : ANY ;	//ANY-Zeiger Quelle
  ZANY : ANY ;	//ANY-Zeiger Ziel
  QAnfang_schleife : INT ;	
  ZAnfang_schleife : INT ;	
  schleifenindex : INT ;	
END_VAR
BEGIN
NETWORK
TITLE =vorbelegen

      NOP   0; //erster zyklus
      L     #Anzahl_Bloecke; //4
      T     #schleifenindex; //4

sanf: NOP   0; //schleifenanfang

// quelle
      L     #schleifenindex; //4      
      L     2; 
      -I    ; //2
      L     #Blockgroesse; //2
      *I    ; //4
      L     #Quelle_Anfang; //1   Anfang der Quelle
      +I    ; //5
      T     #QAnfang_schleife; //anfang vorletzter block

// ziel
      L     #schleifenindex; //4
      L     1; 
      -I    ; //3
      L     #Blockgroesse; //2
      *I    ; //6
      L     #Ziel_Anfang; //1   Anfang des Ziel
      +I    ; //7
      T     #ZAnfang_schleife; //anfang letzter block

NETWORK
TITLE =Verschieben; Zusammenstellung des Quellzeigers

      L     W#16#1002; //Typ BYTE
      T     LW     0; 
      L     #Blockgroesse; //Anzahl Bytes
      T     LW     2; 
      L     #Ziel_DB; //Ziel-DB
      T     LW     4; 
      L     #QAnfang_schleife; //Anfang der Quelle
      SLD   3; 
      OD    DW#16#84000000; 
      T     LD     6; 

NETWORK
TITLE =Verschieben; Zusammenstellung des Zielzeigers

      L     W#16#1002; //Typ BYTE
      T     LW    10; 
      L     #Blockgroesse; //Anzahl Bytes
      T     LW    12; 
      L     #Ziel_DB; //Ziel-DB
      T     LW    14; 
      L     #ZAnfang_schleife; //Anfang der Quelle
      SLD   3; 
      OD    DW#16#84000000; 
      T     LD    16; 

NETWORK
TITLE =Verschieben; Datenbereich kopieren

      CALL SFC   20 (
           SRCBLK                   := #QANY,
           RET_VAL                  := #RET_VAL,
           DSTBLK                   := #ZANY);

NETWORK
TITLE = Schleifenende

      NOP   0; //schleifenanfang

      L     #schleifenindex; //4
      L     1; //1
      -I    ; //3
      T     #schleifenindex; //3

      L     0; 
      <=I   ; 
      SPB   ndat; //schleife fertig; neue daten eintragen

      SPA   sanf; //schleife erneut durchlaufen

NETWORK
TITLE =Neue Daten; Zusammenstellung des Quellzeigers

ndat: NOP   0; 

      L     W#16#1002; //Typ BYTE
      T     LW     0; 
      L     #Blockgroesse; //Anzahl Bytes
      T     LW     2; 
      L     #Quelle_DB; //Quell-DB
      T     LW     4; 
      L     #Quelle_Anfang; //Anfang der Quelle
      SLD   3; 
      OD    DW#16#84000000; 
      T     LD     6; 

NETWORK
TITLE =Neue Daten;  Zusammenstellung des Zielzeigers

      L     W#16#1002; //Typ BYTE
      T     LW    10; 
      L     #Blockgroesse; //Anzahl Bytes
      T     LW    12; 
      L     #Ziel_DB; //Quell-DB
      T     LW    14; 
      L     #Ziel_Anfang; //Anfang der Quelle
      SLD   3; 
      OD    DW#16#84000000; 
      T     LD    16; 

NETWORK
TITLE =Neue Daten;  Datenbereich kopieren

      CALL SFC   20 (
           SRCBLK                   := #QANY,
           RET_VAL                  := #RET_VAL,
           DSTBLK                   := #ZANY);

END_FUNCTION

Code:
ORGANIZATION_BLOCK OB 1
TITLE =
VERSION : 0.0


VAR_TEMP
  OB1_EV_CLASS : BYTE ;	//Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ;	//1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ;	//1 (Priority of 1 is lowest)
  OB1_OB_NUMBR : BYTE ;	//1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ;	//Reserved for system
  OB1_RESERVED_2 : BYTE ;	//Reserved for system
  OB1_PREV_CYCLE : INT ;	//Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ;	//Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ;	//Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ;	//Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =

      U     E      0.0; //daten eintragen
      FP    M     99.0; //flanke

NETWORK
TITLE =

      U     M     99.0; 
      SPBNB _004; 
      CALL "FIFO_Block" (
           Quelle_DB                := 10,
           Quelle_Anfang            := 1,
           Blockgroesse             := 2,
           Anzahl_Bloecke           := 3,
           Ziel_DB                  := 11,
           Ziel_Anfang              := 1,
           RET_VAL                  := MW   100);
_004: NOP   0; 
END_ORGANIZATION_BLOCK
 
Zurück
Oben