DB mit loop durchsuchen

Lagrange007

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

so mein erster Post also habt Nachsicht.

Folgendes Scenario:
Simatic S7 in der Version 5.7 mit PLCSIM

Folgendes Problem:
Ich habe einen DB mit einem eindimensionalem ARRAY (28 Datensätze, INT, Word[0-54])
Von einem FC aus möchte ich eine Schleife erstellen die die 28 Datensätze von Word0 bis Word54 nacheinander nach dem Wert 0 durchsucht.

Was ich im moment nicht gebacken bekomme ist die erhöhung der Suchadresse, jeweils um zwei, innerhalb der Schleife.
Hoffe jemand könnte etwas helfen.

Danke
 
Hier mal ein SCL Beispiel kurz runtergetippt. Variablennamen optimieren darfst du selbst.

Code:
platz : ARRAY[1..28] OF INT;
irgendeinWertIstNull : BOOL;
i : INT;

irgendeinWertIstNull := FALSE;

FOR i := 1 TO 28 DO
    IF platz[i] = 0 THEN
        irgendeinWertIstNull := TRUE;
        EXIT;
    END_IF;
END_FOR;
 
Zuletzt bearbeitet:
Also ist vieleicht etwas unglücklich ausgedrückt:
ARRAY [1..28] of INT

Adresse NAME Typ
0.0 PLATZ[1] INT
2.0 PLATZ[2] INT
4.0 PLATZ[3] INT
...
...
54.0 PLATZ[28] INT
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Zweck des ganzen soll sein dann die Adresse des Word in dem die erste 0 gefunden wurde in einem MW abgelegt wird und es soll nur mit AWL Mitteln gemacht werden.
Was meinst Du mit "Adresse des Word soll in einem MW abgelegt werden"? Adressen sind 32 Bit und können daher nicht in einem MW abgelegt werden.

Hier eine AWL-Variante, die den Index 1..28 liefert, wenn ein INT = 0 ist, und 0 wenn kein INT = 0 ist:
Code:
iIndex    : INT
dwAdresse : DWORD


      L     1                   // Index beginnt mit 1
NEXT: T     #iIndex
      +     -1                  // 1..28 ---> 0..27
      SLD   4                   // 0..27 ---> P#0.0 .. P#54.0
      T     #dwAdresse

      AUF   "MyDB"
      L     DBW [#dwAdresse]    // "MyDB".DBW[#dwAdresse]
      L     0
      ==I                       // = 0 ?
      L     #iIndex             // Index (1..28)
      SPB   RSLT                // springe aus Schleife wenn 0 gefunden
      +     1                   // nächster Index ---> 2..29
      L     29                  // >= 29 ?
      TAK
      >I
      SPB   NEXT

//AKKU1 ist hier 29, wenn keine 0 gefunden wurde
      L     0                   // Ergebniswert bei "nicht gefunden", z.B. 0 oder -1 oder 29 oder ...

RSLT: T     "MeinErgebnisWord"  // Index der Fundstelle (1..28) oder "nicht gefunden"

Harald
 
Zuletzt bearbeitet:
Was meinst Du mit "Adresse des Word soll in einem MW abgelegt werden"? Adressen sind 32 Bit und können daher nicht in einem MW abgelegt werden.
Ich denke ich hab mich bischen unglücklich ausgedrückt. Also vorerst ich mach eine Schulung an eine S7 Simatic und manches steht nicht in den Unterlagen, man muss es selbst suchen. Aber zu meinem "Problem":
(1) ich hab einen DB Global mit einem ARRAY(1..28) of INT
(2) Innerhalb der ARRAY haben die Word's die Bezeichnung Fach[1-28] zbw. Adressen [[0-54].0]
(3) der Zustand der "Fächer" (ob belegt oder nicht und wenn belegt womit) werden durch den INT Wert symbolisiert.

Worum es hier geht ist folgendes: Eine Schleife in AWL zu basteln die alle Fächer nacheinder duchsucht, bis sie ein Fach findet dem ein INT-Wert von eine 0 zugewiesen wurde. Dann Soll die Fachnummer (1-28) in INT im AW10 hinterlegt werden.
Hab inzwischen aus einer "Vorlage" sowas gebastelt, aber ehrlich gesagt würde ich mich freuen wenn ich irgendwo etwas zu lesen zu den Pointern finden könnte.



AUF DB 10
LAR1 P#0.0
L 27
next: T MW 10
L DBW [AR1,P#0.0]
L 0
==I
SPBN s_01
L 28
L MW 10
-I
T AW10
L 0
T MW 10
BEA
s_01: +AR1 P#2.0
L MW 10
LOOP next
 
Zuletzt bearbeitet:
Zurück
Oben