Step 7 Bitmusterüberprüfung mittels Schleife in AWL

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo JS,
genau das will ich machen, aber in einer Schleife, weil ich ja 64 Bitmuster a 4Byte ( = 1Doppelwort) miteinander vergleichen muss.
Und immer gegeneinander, d.h. wenn die ersten 64 vergleiche durch sind muss der zeiger ein Doppelwort tiefer rutschen und 63 vergleiche machen, usw.
Wie schreib ich sowas??
Gruß Rune
 
Siehe Post 2 von Ronin. Den mußt Du nur um die Prüfung der anderen 6 Byte entschlacken.

Wenn Du es auf einer 1500er laufen lassen willst, kannst Du auch ReadFromArrayDB nutzen:

Code:
     L     0
      T     #X
      L     1
      T     #Y
      R     #Meldung

//Start äußere Schleife
// Auslesen erstes Array-Element
Lop1: CALL  ReadFromArrayDB
         db      :="MyDB"
         index   :=#X
         Ret_Val :=#Ret_Val_1
         value   :=#First_UDT
//Start innere Schleife
// Auslesen zweites Array-Element
Lop2: CALL  ReadFromArrayDB
         db      :="MyDB"
         index   :=#Y
         Ret_Val :=#Ret_Val_1
         value   :=#Second_UDT

//Laden der beiden Doppelwörter aus UDT und Vergleich
      L     #First_UDT
      L     #Second_UDT
      ==D
      S     #Meldung

//Hochzählen der inneren Schleife
      L     #Y
      L     1
      +D
      T     #Y
//Nachsehen, ob Schleifenzähler <64
      L     64
      >D
//Dann führe innere Schleife weiter
      SPB   Lop2
//Sonst zähle äußere Schleife hoch
      L     #X
      L     1
      +D
      T     #X
//Startwert innere Schleife setzen
      L     1
      +D
      T     #Y
//Nachsehen, ob Schleifenzähler <64
      L     64
      >D
//Äußere Schleife fortsetzen
      SPB   Lop1

So oder so ähnlich, habe es nicht getestet.
 
Hallo danke ,
erstmal. Ich sende den Post später, vom Programm.
Programm läuft auf 414-3DP oder 416-3DP, bzw. soll dort laufen.
Muss ich noch was beachten?
Gruß Rune
 
Hab mir das Programm nochmal angesehen.

Kann es sein, daß der Fehler hier liegt:

Code:
MX10: L     #Index_VBasis               // Anfangswert laden in AR1
      L     1274                                   // Startadresse ersten der 10 Byte
      *I    
      SLD   3
      LAR1

Da wird auf den ersten Blick 1247 als Strukturgröße und nicht als Offset genutzt... Du mußt immer 10 mit Index multiplizieren und 1247 hinzuaddieren. Oder sehe ich das falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi JS,
ich glaub das könnte der Fehler sein. Ich wird es morgen ausprobieren.
Dann hab ich die ganze Zeit falsch gerechnet bzw. mich gewundert das nix geht.
Danke. ich melde mich.
Gruß Rune
 
Hallo JS ,
anbei ein Auszug von dem von mir geschriebenen Programm, bitte schau es dir nochmals an! Anzeige mit VKE, AKKU1,AKKU2, usw.

Teil1.jpgTeil2.jpg
 
Die 3e kolom isr nicht Akku1 , dass ist Akku2. Weiter must sie auch die DB und dass AR1 tonen.
Nach berechne von die adressen wurde die in ein LD geschrieben und wenn sie die data lese brauchen Sie das AR1 , Sie must die berechende adresse In das AR1 schreiben und nicht in ein LD.

Gruss,

Joop
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Rune17,

Wenn Du mit L (Laden) arbeitest, denke immer, Du arbeitest mit einem Schieberegister mit zwei Speicherplätzen: AKKU1 und AKKU2. Wenn Du lädst, schiebst Du Akku1 in Akku2 (Akku2 geht dabei verloren) und lädst den neuen Wert in Akku1.
Wenn Du also
Code:
L #Basis_1
L 1274
L 10
*D
schreibst, so kickst Du Basis_1 aus der Berechnung und rechnest 1274*10, was aber auch Deinem Ziel nicht entspricht.
Richtig wäre
Code:
L #Basis_1
L 10
*D
      Jetzt hast Du Basis_1*10 in AKKU1
L 1274
      Ergebnis jetzt in AKKU2, 1274 in AKKU1
+D
      Offset hinzugerechnet, Ergebnis in AKKU1
Das gleiche gilt auch für Basis_2.

Den Sinn von Deinem XOD verstehe ich nicht.
Du lädst dann AKKU1 in den Ladespeicher (LD400). Du müßtest aber in das Adressregister1 laden (LAR1), denn damit arbeitest Du beim DB-Zugriff weiter. Bitte sieh Dir dazu das Beispiel von Ronin nochmal an.

NW27: Das U() kannst Du Dir sparen, da das S nur vom ==D beeinflußt wird und Du keine weitere Verknüpfung machst.
Das SPB kannst Du auch durch SPA ersetzen, weil Du immer springen willst.

Das, was mir aufgefallen ist.
 
Wenn Du mit L (Laden) arbeitest, denke immer, Du arbeitest mit einem Schieberegister mit zwei Speicherplätzen: AKKU1 und AKKU2. Wenn Du lädst, schiebst Du Akku1 in Akku2 (Akku2 geht dabei verloren) und lädst den neuen Wert in Akku1.

Ist das bei einer 414 CPU von Siemens wirklich so? Hat die nicht 4 Akkus?? ;-)
 
Danke Gerhard,
wieder was dazu gelernt... beschäftige mich eigentlich nur mit AWL, wenn es nicht anders geht, daher hab ich mich darum noch nie gekümmert...
Trotzdem wirken sich Berechnungsschritte immer nur auf Akku1 und 2 aus, wenn ich das richtig sehe!?

Gilt das dann auch für die 1500er?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du 3 Werte bei der 400er zusammenzählen willst, schreibst du:
Code:
L wert1
L wert2
L wert3
+I
t Summe
Das geht bei der 300er nicht. Mit einer 1500er habe ich noch nicht gearbeitet.
Gruß Gerhard
 
Zuletzt bearbeitet:
Wenn du 3 Werte bei der 400er zusammenzählen willst, schreibst du:
Code:
L wert1
L wert2
L wert3
+I
t Summe
Du hast wohl auch nicht oft mit AWL bzw. mit S7-400 zu tun? ;)
Auch bei der S7-400 addiert +I nur AKKU1 und AKKU2. Es werden lediglich danach die AKKU3 und AKKU4 nach AKKU2 und AKKU3 kopiert - siehe AWL-Hilfe zu +I (F1)

PS: Du könntest aber schreiben:
Code:
L wert1
L wert2
L wert3
+I
+I
T Summe
Das geht tatsächlich nur bei der S7-400 bzw. CPUs mit 4 Akkus.

Harald
 
So oft hatte ich tatsächlich noch nicht mit 400er zu tun. Habe aber gedacht, mich daran erinnern zu können, dass mir bei der Siemens Schulung damals, dass so erklärt wurde.
Aber da kann ich mich natürlich täuschen. Vergesse/verwechsle in letzter Zeit schon eine Menge. :-D
Auf jeden Fall Danke für die Klarstellung Harald.

Gerhard
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:oops: Ich muß meinen Beitrag #33 korrigieren: der Lade-Befehl verändert AKKU3 und AKKU4 nicht, dazu braucht man noch einen extra Befehl ENT. So funktioniert es tatsächlich auf S7-400:
Code:
L wert1
L wert2
ENT
L wert3
+I
+I
T Summe

Harald
 
:oops: Ich muß meinen Beitrag #33 korrigieren: der Lade-Befehl verändert AKKU3 und AKKU4 nicht, dazu braucht man noch einen extra Befehl ENT. So funktioniert es tatsächlich auf S7-400:
Code:
L wert1
L wert2
ENT
L wert3
+I
+I
T Summe

Gibts da Vorteile es so zu machen? anstatt immer Akku1 und 2 zusammenzurechnen bevor man den nächsten wert läd, in der 400er? Ich meine es sind ja dann trotzdem die gleichen Anweisungen nötig plus zusätzlich noch ENT. Also kanns keine Zeiterersparnis bringen.
Ich nutze die 400er eben normalerweise wie die 300er. Oder anders gefragt, wo macht es Sinn die zusätzlichen Features der 400er hinsichtlich Architektur auszunutzen?

Wird SCL für die 400er anders interpretiert als für die 300er?

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also war meine erste Aussage doch erst einmal richtig ;)
Ja :D


Ich nutze die 400er eben normalerweise wie die 300er. Oder anders gefragt, wo macht es Sinn die zusätzlichen Features der 400er hinsichtlich Architektur auszunutzen?
Ich kenne kein Programm, wo AKKU3 oder AKKU4 genutzt werden, kann mir aber Anwendungsfälle vorstellen, wo ich Werte gerne in mehr AKKUs halten würde statt in (lokalen) Variablen. AKKU3 und AKKU4 sind ein nettes Gimmick, was aber anscheinend kaum jemand nutzt.
Ich schreibe meine Programme auch so, daß ich AKKU3 und AKKU4 nicht nutze, damit sie auf S7-300 und S7-400 gleichermaßen lauffähig sind.
Bei POP muß man ein bisschen aufpassen, daß man POP nicht mehrfach ausführt, weil bei S7-300 der AKKU2 erhalten bleibt, bei S7-400 aber durch AKKU3 überschrieben wird.

Harald
 
Zurück
Oben