Indirekte register adressierung

sebastian2010

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Habe mehrere DBs, DB1, DB2, DB3, usw.… und jede DB ist für eine Maschine, jede 5 Sekunden wird den Inhalt diese DBs in einem DB10 kopiert
Das heisst:
Daten von DB1 werden geschrieben (Teile Hochzählen) >> nach 5 Sekunden >>in DB10 kopiert, dann
Daten von DB2 werden geschrieben (Teile Hochzählen) >> nach 5 Sekunden >>in DB10 kopiert

Ich möchte irgendwie ein bisschen das ganze flexibler machen, dass die Daten die in DB 10 nicht durch den 2. Kopiervorgang gelöscht werden, die sollten gespeichert bleiben .
habe gehört als Lösung muss ich so eine Schleife mit die indirekte Adressierung (LAR1+W#) arbeiten, leider habe ich bis jetzt noch nie damit gearbeitet ….
Kann mir jemand BITTE sagen wie ich mit eine indirekte registeradressierung arbeiten ???
Danke .

Gruß
sebastian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Marlob
Danke für den link
leider kann ich nicht viel damit anfangen , da habe ich noch nie damit gearbeitet , gibt es irgend ein einfaches beispiel mit erläuterung :-(
danke
Gruß
Sebastian
 
Hallo
Danke für die antworte
und weißt jemanden vielleicht wie man die Daten von ein DB zu ein andere DB schieben kann , ZB , die Daten vom DB1 werden in DB2 geschoben , dann in DB3 usw... bis DB 4
eine Idee Vielleicht ?
Grüße
Sebastian
 
ja stimmt aber das ist nicht flexibel , sag ich mal , ich habe gehört man kann die daten in register schieben , oder mit ein flexibler Pointer,aber wie , das ist eine gute frage :-(
Grüsse
Sebastian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin!

Da ich mal ein ähnliches Problem hatte, hier mein Vorschlag:

Code:
FUNCTION "DB<==>DB Copy" : VOID
TITLE =Datenbaustein komplett in einen anderen umkopieren
AUTHOR : - - - 
VERSION : 0.1


VAR_INPUT
  Quell_DB : INT ;    
  Ziel_DB : INT ;    
END_VAR
VAR_OUTPUT
  RetVal : INT ;    
END_VAR
VAR_TEMP
  Quellpointer : ANY ;    
  ZielPointer : ANY ;    
  Quell_DB_TMP : INT ;    
  Ziel_DB_TMP : INT ;    
  Laenge_Quell_DB : INT ;    
  Laenge_Ziel_DB : INT ;    
  Adressregister_1 : DWORD ;    
  Adressregister_2 : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =Adressregister sichern

      TAR1  #Adressregister_1; 
      TAR2  #Adressregister_2; 
NETWORK
TITLE =Länge des zu kopierenden Bereichs bestimmen

      L     #Quell_DB; 
      T     #Quell_DB_TMP; 
      L     0; 
      ==I   ; 
      L     1; // Fehlernummer für die RetVal
      SPB   ENDE; 
      AUF   DB [#Quell_DB_TMP]; 
      L     DBLG; // Länge des DB auslesen
      T     #Laenge_Quell_DB; 
NETWORK
TITLE =Länge des Zieldatenbausteins auslesen

      L     #Ziel_DB; 
      T     #Ziel_DB_TMP; 
      L     0; 
      ==I   ; 
      L     2; // Fehlernummer für die RetVal
      SPB   ENDE; 
      AUF   DB [#Ziel_DB_TMP]; 
      L     DBLG; // Länge des DB auslesen
      T     #Laenge_Ziel_DB; 
NETWORK
TITLE =Kontrolle ob beide Datenbausteine gleich lang sind

      L     #Laenge_Quell_DB; // Nur kopieren, wenn Quelle und Ziel gleich lang sind
      L     #Laenge_Ziel_DB; 
      ==I   ; 
      L     3; // Fehlernummer für die RetVal
      SPBN  ENDE; 
NETWORK
TITLE =Any-Poniter auf den Quell-Datenbeustein

      LAR1  P##Quellpointer; 
      L     B#16#10; // Syntax-ID (AWL)
      T     LB [AR1,P#0.0]; 
      L     B#16#2; // Datentyp BYTE
      T     LB [AR1,P#1.0]; 
      L     #Laenge_Quell_DB; // Anzahl Byte
      T     LW [AR1,P#2.0]; 
      L     #Quell_DB; // Datenbausteinnummer
      T     LW [AR1,P#4.0]; 
      L     P#DBX 0.0; // Pointer auf Byte und Bit
      T     LD [AR1,P#6.0]; 
NETWORK
TITLE =Any-Pointer auf den Zieldatenbaustein

      LAR2  P##ZielPointer; 
      L     B#16#10; // Syntax-ID (AWL)
      T     LB [AR2,P#0.0]; 
      L     B#16#2; // Datentyp BYTE
      T     LB [AR2,P#1.0]; 
      L     #Laenge_Quell_DB; // Anzahl Byte
      T     LW [AR2,P#2.0]; 
      L     #Ziel_DB; // Datenbausteinnummer
      T     LW [AR2,P#4.0]; 
      L     P#DBX 0.0; // Pointer auf Byte und Bit
      T     LD [AR2,P#6.0]; 
NETWORK
TITLE =DB komplett umkopieren

      CALL "BLKMOV" (
           SRCBLK                   := #Quellpointer,
           RET_VAL                  := #RetVal,
           DSTBLK                   := #ZielPointer);

NETWORK
TITLE =Rückmeldung nach aussen

ENDE: T     #RetVal; 
NETWORK
TITLE =Adressregister rücksichern

      LAR1  #Adressregister_1; 
      LAR2  #Adressregister_2; 
END_FUNCTION

Den Code kannst Du als Quelle importieren.
Meinen Ansprüchen hat der FC Genüge getan.

Mal schauen was die Profis hier dazu sagen ;)

Viele Grüße aus Nordhessen
DaMeista
 
Zurück
Oben