db variabel beschreiben und lesen

demmy86

Level-2
Beiträge
202
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

gibt es eine Möglichkeit einen DB variabel zu beschreiben.
Was ich meine ist, ich möchte einen Baustein erzeugen bei dem ich nur den db als Eingang bzw einen zweiten db als Ausgang angebe und in diesem Baustein soll dann der DB gelesen bzw. geschrieben werden. Die länge der Bytes ist aber unterschiedlich. Das heißt ich muss evtl. mal die ersten 7 Bytes aus dem DB und dann evtl. die ersten 12 Bytes aus dem DB lesen und schreiben Usw. Ich will den Db also nur als Datenspeicher nutzen um dort eine Variabele Länge an Datenbytes zu hinterlegen.
Weil normal kann ich ja maximal ein doppelwort auslesen und schreiben und muss dieses ja auch definiert über dbx.dbdx angeben!?

Ich hoffe ich konnte rüber bringen was ich meine!?

Gruß
 
Das heißt ich muss evtl. mal die ersten 7 Bytes aus dem DB und dann evtl. die ersten 12 Bytes aus dem DB lesen und schreiben Usw. Ich will den Db also nur als Datenspeicher nutzen um dort eine Variabele Länge an Datenbytes zu hinterlegen.
Weil normal kann ich ja maximal ein doppelwort auslesen und schreiben und muss dieses ja auch definiert über dbx.dbdx angeben!?
Was du brauchst, ist ein variabler Any-Zeiger.
http://sps-forum.de/showthread.php?t=12923
 
Weil normal kann ich ja maximal ein doppelwort auslesen und schreiben und muss dieses ja auch definiert über dbx.dbdx angeben!?

Wie schon gesagt wurde "ANY-pointer" erzeugen. Mit "SFC20 BLKMOV" kann auch mehr als ein Doppelwort kopiert werden. Bei unterschiedlichen DB-Größen mußt du aber aufpassen, dass die Bereichslängen stimmen, sonst steht die CPU...
 
Und wie Funktioniert das nun mit dem sfc 20?

Wie muss ich da angeben in welchen DB ich wieviele bytes schreiben bzw lesen will??

Ich versteh das noch nicht ganz. Und die Simatichilfe ist da auch nicht sehr hilfreich.

Gibt es denn einen Variablentyp der einen DB beschreibt? denn ich muss ja jedesmal dem Baustein einen anderen Quell und Ziel Db zuweisen wenn ich das so richtig verstanden habe?
 
Zuletzt bearbeitet:
Hi,
ich hab den Beitrag gelesen. Ich Programmiere in SCL und rätsele gerade wie ich denn da diese Anyvariable beschreiben muss um 12Byte aus einem DB in ein Byte array ein zu lesen?
 
Ich Programmiere in SCL und rätsele gerade wie ich denn da diese Anyvariable beschreiben muss um 12Byte aus einem DB in ein Byte array ein zu lesen?
Aber dann ist es ja noch viel einfacher. :D
Dann brauchst doch nur die Anzahl der FOR-Schleife übergeben und in dieser Schleife wird Quelle auf Ziel kopiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja schon, das mir schon klar.

nur wie muss ich diese Anyvariable beschreiben um z.b db10 aus zu wählen und die ersten 12 byte?

ich habe es jetzt so versucht.

Code:
VAR_TEMP
     Quell_DB : ANY;
     Quelle AT Quell_DB : STRUCT 
       ID    : BYTE; 
       TYP   : BYTE; 
       CNT   : INT; 
       DBN   : INT; 
       SAD   : INT;
       PTR   : INT; 
      
    END_STRUCT;
      
   Ziel_DB : ANY;
END_VAR
 
BEGIN
Quelle.ID := 10; // 10 Für S7
Quelle.TYP := 2 ; // 2 Für Byte (4 für Word)
Quelle.CNT := 12; // Anzahl
Quelle.DBN := 10; // Datenbaustein (0 wenn nicht auf DB's zugegriffen wird)
Quelle.SAD := 0; //Anfangsadresse
Quelle.PTR := 84;//84 für DB (83 für Merkerbereich)

is das so korrekt?

für was is dieser PTR gut???
das is leider alles was ich bisher herausfinden konnte!
 
Zuletzt bearbeitet:
Hi,

...

Code:
VAR_TEMP
     Quell_DB : ANY;
     Quelle AT Quell_DB : STRUCT 
       ID    : BYTE; 
       TYP   : BYTE; 
       CNT   : INT; 
       DBN   : INT; 
       PTR   : DWORD; 
      
    END_STRUCT;
      
   Ziel_DB : ANY;
END_VAR
 
BEGIN
Quelle.ID := 10; // 10 Für S7
Quelle.TYP := 2 ; // 2 Für Byte (4 für Word)
Quelle.CNT := 12; // Anzahl
Quelle.DBN := 10; // Datenbaustein (0 wenn nicht auf DB's zugegriffen wird)
[COLOR=Red]Quelle.PTR := dw#16#84000000;[/COLOR]  //Byte- und Bitadresse des Datenbausteins 84 für DB (83 für Merkerbereich)
is das so korrekt?

für was is dieser PTR gut???

Byte- und Bitadresse des Datenanfangs, aber Achtung die ersten 3 Bits sind für die Bitadresse.

Gruss Daniel
 
hi,
wie gesagt ich kenne mich in AWL nicht so gut aus.

was ich daraus lesen konnte ist das der Pointer 4 byte lang ist.

Code:
 L     20                        //Anfangsadresse
      SLD   3                         //Pointer bauen
      T     LD     6
      L     B#16#83                   //Speicherbereich (hier Merker)
      T     LB     6

Was bedeutet hier das SLD? Ist das so, dass ihr das .3 Byte des DW6 mit der Anfangsadresse 20 beschreibt? und dann das 1. Byte des DW6 mit dem Speicherbereich? Kann ich den Speicherbereich und das Startbyte sowie das Startbit falls es eins gibt nicht in einer eigenen Variable angeben? Dann wäre das doch alles viel Flexibler!?

Man müsste doch nur das Byte des Speicherbereiches irgendwie separat füllen, und den Rest ebenfalls? Das Problem ist nur wie füge ich das alles zusammen, das die letzten 3 bit den Bitbereich und die Bits davor den startbereich beschreiben? Hat sowas noch niemand gemacht?

Sorry wenn ich da noch nicht so ganz durchblicke.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was bedeutet hier das SLD? .....
Das Problem ist nur wie füge ich das alles zusammen, das die letzten 3 bit den Bitbereich und die Bits davor den startbereich beschreiben? Hat sowas noch niemand gemacht?
Darum das > SLD 3 <, Platz machen für die nicht vorhandenen Bits.
Damit du die Bit-Adresse 0-7 darstellen kannst werden halt 3 Stellen benötigt.

Alles zusammengesetzt ergibt dann Speicherbereich + Byte und Bit Adresse.
 
Zurück
Oben