Datenbankproblem mit Schleife

stackoverflow

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

ich bin noch relativ neu im AWL-Programmieren und erhoffe mir Hilfe bei einem Problem. Ich will ein DBD eines DB´s mit einer Liste DBD`s eines anderen vergleichen und ein angehängtes Datenwort analog ausgeben. Ich habe den zu vergleichenden Abschnitt des DB´s festgelegt, vergleiche auf ungleich, setze den Suchwert auf +6 (DBD + DBW) und das ganze von vorne, bis ich Plausibilität habe. Jetzt bekomme ich einen Programmierfehler in der CPU und es scheint, das die Schleife über den Bereich hinweg fegt, obwohl ein passender Datensatz vorhanden ist! Ergo passt etwas am Vergleich nicht. Wenn mir jemand sagen könnte, wo der Hund begraben liegt, wäre das nett. Der Ausschnitt des Programms ist im Anhang.

Vielen Dank

Anhang anzeigen ProgrammS7VV.txt
 
Ich hab mit deinen Code mal kurz angesehen. Ohne ihn jetzt komplett zu bewerten und zu korrigieren, Folgendes:

1. Du mußt in den eckigen Klammern beim Adressieren des DW das Pointerformat verwenden, noch besser du adressierst gleich über AR1 und den enprechenden Aufruf.
2. Aufpassen, wenn du L DB100.DBD5 schreibst, der folgende Aufruf, L DBD [#Anfangswert], nimmt den Wert dann auch aus DB100!

Hier mal ein kurzes Codebeispiel zu 1.

Code:
      AUF   DB    18


      L     P#0.0
      T     #pointer_1


      L     0
      T     #ergebnis


      L     31                          //Anzahl Störmeldungen (Wortweise)
SC02: T     #zaehler


      L     DBW [#pointer_1]            // Lade Datenwort
      L     0                           // Lade 0
      ==I                               // keine Störmeldung !!!
      SPB   NUL2                        // Ergebnis nicht hochzählen
      L     #ergebnis                   // bei Erg <> 0 Ergebnis hochzählen
      L     1                           // um 1 erhöhen
      +I    
      T     #ergebnis


NUL2: NOP   0                           // Zeiger erhöhen aud nächstest DW
      L     #pointer_1
      L     P#2.0
      +D    
      T     #pointer_1
      L     #zaehler
      LOOP  SC02                        // Schleife solange, bis #zaehler auf 0


      L     #ergebnis                   // bei Ergebnis <> 0 liegt Fehler vor
      L     0
      <>I   
      =     M      1.0

PS: Pointer_1 als DWORD in Temp angelegt. "Pointerformat" ergibt sich über P#0.0, das in pointer_1 geladen wird.
 
Zurück
Oben