Step 7 Pointer DB

B

BlackDice

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,
ich bin grad dabei einen Pointer zu programmieren um Daten in einen DB zu schreiben. Diese Sollen dann von der ersten Adresse bis zu letzten durchlaufen. Mein Netzwerk sieht zur zeit so aus:
Code:
      U     M      0.0
      FP    M     99.0

      AUF   DB     1
      L     P#0.0

      L     0
      T     #Zaehler

Loop: L     #Zaehler
      SLD   3
      LAR1  

      L     DBD [AR1,P#2.0]
      T     DBD [AR1,P#6.0]

      L     #Zaehler
      L     26
      >=D   
      SPB   ENDE

      L     #Zaehler
      L     L#4
      +D    
      T     #Zaehler
      SPA   Loop


ENDE: NOP   0
Durch den M0.0 möchte ich das die Daten nur bei einer Positiven Flanke weiter geschoben werden.
Das Problem ist dass meine PLCSim in Stop geht der Diagnosepuffer sagt "Bereislängenfehler beim lesen" und zwar bei deim L und T [AR1,P#2.0] und [AR1,P#6.0]

Viele Dan schonmal
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie groß ist denn der angelegte DB1. Ist er mindestens 10 Byte lang ?

Ich habe gerade gesehen, dass noch hochgezählt wird. Dementsprechend müsste der DB1 noch länger sein.

Mit Grüßen
 
Zuletzt bearbeitet:
Was jetzt schon einmal auffällt, ist der Vergleich und das addieren.
Im ersten Zyklus kommst der #Zaehler mit 0 rein, dann wird +4 addiert, dann noch einmal 4 addiert.
Das heißt, der Vergleich auf =6 wird nicht greifen sondern nur der >6. Welches Format hat der #Zaehler,
weil du mit +D addierst. Ist es ein Word oder DWORD?
 
Ok da ist mir beim Kopieren was abhanden gekommen. Ich vergleiche auf 26. Hab ich im ersten post auch schon geändert.
Meine Idee ist dass ich mehrere Plätzte (2,6,8,10,14,18,22 und 26) habe. Der erste wert soll auf Platz 2 eingetragen werden und dann mit der Positiven Flanke auf den nächsten Platz kopiert werden.
Der Zähler ist Real
Das ist Baustein adresse 108. Wenn ich dann mit "Gehe zu" zum Fehler springe ist der Cursor bei der Zeile "L DBD [AR1,P#0.0]
 
Zuletzt bearbeitet:
mir fallen anderes auf.

a) das mit der pos. Flanke, wäre wohl so:
U M 0.0
FP M 99.0
spb Go
bea

Go: AUF DB 1
....


b) loop
hab grad das Berger-Buch da.

L Anzahl
Next: T #Zaehler

...

L #Zaehler
Loop Next

der "Loop" läuft rückwärts !


c) richtung:
mit
L DBD [AR1,P#2.0]
T DBD [AR1,P#6.0]
willst du die daten nach hinten schieben.
damit du nichts überschreibst, was schon dort ist, müsste man von hinten anfangen und die daten aus dieser richtung "holen".

das erhöhnen vom AR1 kannst du sicher selbst:
+AR1 P#2.0 bei Wortweise
+AR1 P#4.0 bei DWortweise
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann müsste es ja so etwas richtiger sein. Sage ich den denn eigentlich nicht durch die 26 die in ich den Zähler lade dass er bei Adresse 26 Anfangen soll?

Code:
U     M      0.0     
 FP    M     99.0


      SPB   Los
      BEA   


Los:  AUF   DB     1
      L     P#0.0


      L     26
      T     #Zaehler


Loop: L     #Zaehler
      SLD   3
      LAR1  


      L     DBD [AR1,P#0.0]
      T     DBD [AR1,P#4.0]


      L     #Zaehler
      L     2
      >=D   
      SPB   ENDE


      L     #Zaehler
      L     L#4
      -D    
      T     #Zaehler
      SPA   Loop


ENDE: NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok danke das hat jetzt alles geklappt.

Jetzt möchte ich aber noch die ganzen Werte die im DB1 stehen von DB1.DBD2 bis DBD30 addieren und im DBD38 ausgeben.

Code:
      AUF   DB     1      
L     P#2.0

      L     0
      T     DB1.DBD   46

hoch: L     DB1.DBD    2
      SRD   3
      LAR1  

      L     DBD [AR2,P#2.0]
      L     DB1.DBD   38
      +D    
      T     DB1.DBD   38

      L     DB1.DBD   46
      L     30
      >=D   
      SPB   ende

      L     DB1.DBD   46
      L     L#4
      +D    
      T     DB1.DBD   46

      SPA   hoch

ende: NOP   0
 
Trink' mal noch einen Kaffee und dann konzentriere Dich mal. Außerdem wird ein Code gleich viel verständlicher (auch für den Programmierer selber ;)), und man sieht Fehler viel schneller, wenn man ein bisschen Symbolik benutzt, sprich: statt Adressen DBD38 und DBD46 symbolische Namen vergibt: z.B. Summe und Loopzaehler, und dem DB1 auch einen Symbolname geben.

Code:
[COLOR="#FF0000"]      AUF   DB     1      
L     P#2.0[/COLOR]

      L     0
      T     DB1.DBD   46

hoch: L     [COLOR="#FF0000"]DB1.DBD    2[/COLOR]
      [COLOR="#FF0000"]SRD[/COLOR]   3
      [COLOR="#FF0000"]LAR1[/COLOR]  

      L     DBD [[COLOR="#FF0000"]AR2[/COLOR],P#2.0]
      L     DB1.DBD   38
      +D    
      T     DB1.DBD   38

      L     DB1.DBD   46
      L     30
      >=D   
      SPB   ende

      L     DB1.DBD   46
      L     L#4
      +D    
      T     DB1.DBD   46

      SPA   hoch

ende: NOP   0

Besser:
Code:
      L     0
      T     DB1.DBD   38     //Summe auf 0 initialisieren

      L     2                //Nummer erstes DBD: DBD2
hoch: T     DB1.DBD   46     //Schleifenzähler
      SLD   3                //Nummer --> Adresse: n --> P#n.0
      LAR1

//Werte addieren:
//      AUF   DB1            //AUF Daten-DB hier, falls die Daten in einem anderen DB stehen
      L     DBD [AR1,P#0.0]
      L     DB1.DBD   38
      +D    
      T     DB1.DBD   38

//Anzahl Durchläufe erreicht?
      L     DB1.DBD   46     //Schleifenzähler
      L     34
      >=D   
      SPB   ende

//Schleifenzähler auf nächstes DBD weiterstellen:
      L     DB1.DBD   46
      L     L#4
      +D    
//      T     DB1.DBD   46     //hier unnötig, wird bei hoch: gespeichert

      SPA   hoch

ende: NOP   0

Harald
 
Ok danke. Ich habe AR2 verwenden weil ich das AR1 schon im Netzwerk darüber verwende.

Der richtige Wert wird noch nicht ausgegeben. Da kümmer ich mich aber gleich drum.
Jetzt habe ich allerdings das Problem das dieses Netzwerk im Test nicht aufgerufen wird. Also der Run Balken ist zwar grün aber bewegt sich nicht.

edit:
Ok hat sich geklärt. Funktioniert alles. Fast. Denke die anderen Kleinigkeiten bekomme ich hin. Danke nochmals.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe AR2 verwenden weil ich das AR1 schon im Netzwerk darüber verwende.
Das tut dem AR1 nichts, wenn es nacheinander für was anderes verwendet wird.

Besser, man benutzt das AR2 nur wenn unbedingt nötig, dann hat man weniger nachzuarbeiten, falls man den Code in einen als "multiinstanzfähig" markierten FB kopiert, weil da darf man AR2 nicht so einfach verändern.

Ohne die Adressregister AR1/AR2 und besser lesbar ist speicherindirekte Adressierung mit dem variablen Pointer in einer TEMP-Variable:
Code:
//TEMP: [COLOR="#0000FF"]DBD_Pointer[/COLOR] : DINT ; (DWORD geht auch)

      L     0
      T     "DB1".Summe         //Summe auf 0 initialisieren

      L     P#2.0               //Adresse erstes DBD: DBD2
hoch: T     [COLOR="#0000FF"]#DBD_Pointer[/COLOR]

//Werte addieren:
//      AUF   DB1               //AUF Daten-DB hier, falls die Daten in einem anderen DB stehen
      L     DBD [[COLOR="#0000FF"]#DBD_Pointer[/COLOR]]
      L     "DB1".Summe
      +D    
      T     "DB1".Summe

//Anzahl Durchläufe erreicht?
      L     [COLOR="#0000FF"]#DBD_Pointer[/COLOR]
      L     P#34.0
      >=D   
      SPB   ende

//Pointer auf nächstes DBD weiterstellen:
      L     [COLOR="#0000FF"]#DBD_Pointer[/COLOR]
      L     P#4.0
      +D    
      SPA   hoch

ende: NOP   0

Harald
 
Zurück
Oben