Step 7 Schleife AWL

MC_DARKSTONE

Level-1
Beiträge
25
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
kennt einer das Problem, dass eine Schleife (LOOP) nicht vorzeitig beendet wird.

Meine Schleife soll max 256 durchläufe machen, fall aber ein bestimmter Wert X im DB steht soll diese beendet werden durch ein Sprung.
Dies funktioniert solange der Wert X an stelle 0 bis 215 im DB steht (216 Schleifen)
Steht der Wert X an der Stelle 216 wird die Schleife nicht vorzeitig beendet.

L 256
Schl: T loopzahler
L DBB[AR1, P0.0]
L WertX
==I
SPB RAUS
...
...

L P#1.0
+AR1
...
...
L loopzahler
LOOP Schl

Gruß
Erick
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
in wirklichkeit zeigt das AR1 auf DB200.DBB 536.0 und ein AR2 wird wird auch verwendet.

1. Es soll der Wert aus DBB [AR1] nehmen und vergleichen auf größer 40 (alle Werte liegen zwischen 30 und 50 nur WertX ist gleich 13)
Wahr -> dann wird aus der Schleife raus gesprungen (SPBN Groe) und eine Berechnung durchgeführt, danach wird zurück in Schleife gesprungen ( ASC1: T ...)
2.....
Diese wird 255 mal durchgeführt oder solange bis in "DBW [AR1,P#2.0]" der Wert "WertX" steht.
Wie gesagt es geht 215 schleifen gut und ab dann wird WertX nicht mehr erkannt bzw. der Vergleich auf den WertX

Code:
L     P#536.0
LAR1        
L     P#1050.0
LAR2  

L     255
Schl: T     #loopzahler             
L     DBB [AR1,P#0.0] // Lade 1.Byte      
L     B#16#40      
<I    // DBB X kleiner "40" dann SP nicht        
SPBN  Groe      
L     DBB [AR1,P#0.0]      
L     B#16#0// DBB X auf "0" überprüfen      
==I         
SPB   ASC1      
L     DBB [AR1,P#0.0]      
L     16// DBB X um 4 stellen nach Links verschieben      
*I    
ASC1: T     DBW 1320// 1. konvertierte Byte Hex zwischenspeichern 
//--------------------------
//Berechnung des 2. Bytes 
//--------------------------      
L     DBB [AR1,P#1.0]      
L     B#16#40      
<I          
SPBN  Gro2      
L     DBB [AR1,P#1.0]      
L     B#16#0      
==I         
SPB   Calc      
L     DBB [AR1,P#1.0]// Wenn DBB X+1 kleiner 40 dann Subtr "30" damit nur 1 dezstelle über bleibt     
 L     B#16#30      
-I    
Calc: T     DBW 1322//DBrechner2      
L     DBW 1320      
+I          
T     DBW 1320      
T     DBB [AR2,P#0.0]
//-----------------------------------
//Auf endzeichen ueberpruefen 
//-----------------------------------      
[COLOR=#ff0000][B]L     WertX// Prüfen ob WertX nächste Runde auftritt     
L     DBW [AR1,P#2.0] 
==I         
SPB   opei[/B][/COLOR]
  L     P#1.0     
 +AR1      
+AR1       
+AR2 
L     #loopzahler          
 LOOP  Schl

opei:....

Ich verwende eine S7-412 5H Version 6.02 mit STEP7 5.5

Gruß
Erick
 
Zuletzt bearbeitet:
Hallo,
dein Problem ist der +AR1-Befehl. Der addiert nur auf 16 Bit-Breite. Dabei kannst du (je nachdem, wo du dich mit deinem AR1 schon befindest) schnell aus seinem Bereich herauslaufen.
Bitte dazu mal die Step7-Hilfe anschauen.
Ich denke, dein Problem wird schon gelösst sein, wenn du den Pointer vollwertig aufaddierst ...

Gruß
Larry
 
Hallo,
dein Problem ist der +AR1-Befehl. Der addiert nur auf 16 Bit-Breite. Dabei kannst du (je nachdem, wo du dich mit deinem AR1 schon befindest) schnell aus seinem Bereich herauslaufen.
Bitte dazu mal die Step7-Hilfe anschauen.
Ich denke, dein Problem wird schon gelösst sein, wenn du den Pointer vollwertig aufaddierst ...

Gruß
Larry

Hallo,

das ist Quatsch! +AR1 arbeitet mit 32 Bit. Man kann nur nichts dazuadddieren was grösser als 16 Bit ist. Da der TE aber nur jeweils ein P#1.0 dazuaddiert ist da nicht das Problem.

Einfach mal das Ergebnis vergleichen:

LAR1 P#1.0
L P#32768.0
+AR1

LAR1 P#32768.0
L P#1.0
+AR1

André
 
Was mich mal interessieren würde, wo steht WERT_X?
ist das fest in einer Temp (am Anfang des FC) abgelegt oder wird das aus einem DB (welchem) geholt oder ist das eine STAT?
 
Hi

WertX ist ein fester Wert -> ersetze WertX durch

L W#16#0D0A

Das Problem ist das ich nicht weis woher es kommt und warum,
Ich habe ein Zähler mit laufen lassen um fest zustellen wieviele durchläufe die Schleife macht, daher weis ich auch das die Schleife komplett (255) durchläuft.
Außer bei Werten kleiner 108 (=215 Schleifen), wo die Schleife vorzeitig beendet wird.

Ich habe nur die Befürchtung das dies sich unter Prozessbedingungen noch weiter reduziert.
Zur zeit habe ich das ganze so begrenzt, dass der WertX max an der 100. Stelle auftauchen kann (= 200 Schleifen)

Die SPS hat zur zeit nur 2 FC enthalten, nun ist die Frage was passiert unter real Bedingungen!

Kleines BSP der auszuwertenden Werte
1. BSP (Schleife wird in der 2. Runde beendet)
DBB 536 = 30 ...
DBB 537 = 41 ...
DBB 538 = 49 (0x31)
DBB 539 = 00 (0x00)
DBB 540 = 13 (0x0D)
DBB 541 = 10 (0x0A)

2. BSP (Schleife wird in der 103. Runde beendet)
DBB 536 = 30 ...
DBB 537 = 41 ...
DBB 538 = 49 (0x31)
DBB 539 = 00 (0x00)
DBB ...
DBB 740 = 36 ...
DBB 741 = 00 ...
DBB 742 = 13 (0x0D)
DBB 743 = 10 (0x0A)

In der Ersten "Runde" wird die 30 & 41 abgefragt und berechnungen durchgeführt
zusätzlich überprüft ob die nachfolgenden 2 Bytes (0x3100) // L DBW[AR1, P#2.0] = 0x0D0A entsprechen
Wenn nicht dann springe zur nächsten Runde und erhöhe das AR1 um 2 stellen und AR2 um 1 stelle.

Gruß
Erick
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Steht das 0D0A immer in einem gerade Word? (Ist ja offensichtlich ein String der da kommt und wenn ich das richtig sehe, erkennst du 0D0A nur, wenn das auf einer geraden Adresse steht, es kann aber auch noch ein Byte verschoben sein, wenn ein Buchstabe mehr im Text steht.

Oder hab ich da einen Denkfehler?
 
Es sind 2 unterschiedliche FC aber der eine wird erst aufgerufen wenn der jeweils andere beendet ist.

Das 0D0A steht immer an einer geraden Stelle / sollte immer!
Es handelt sich um ein ASCII Telegramm daher verschiebt sich das 0D0A immer um 4 Stellen ( 1 ASCII Register entspricht 4 Byte ),
ich kann dies aber nochmals überprüfen ob ab einer zu hohen anzahl von ASCII Register das 0D0A immer noch um 4 stellen verschoben wird.

Gruß Erick
 
Hi,
ich habe es nochmal getestet die schleife kann 219 durchläufe machen danach ist es nicht möglich sie vorzeitig zu beenden.
Das 0D0A beginnt immer auf einem geraden Word

Ich habe eine weitere Schleife eingefügt die nur jeden Wert in DBB[AR1] Addieren soll bis 0D0A erreicht ist, selbst hier wird die Schleife nicht vorzeitig beendet.

Gruß
Erick
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Welche Werte haben AR1 und AR2 nach 219 Durchläufen?
Wären/sind die Adressen in AR1/AR2 nach 220 Durchläufen immer noch in dem DB?
Ist da auch der richtige DB geöffnet? Wo wird der geöffnet? Ist der auch groß genug?

Gibt es Einträge im Diagnosepuffer der CPU?

Ist Dein Programm in Beitrag #3 identisch mit dem Programm in der CPU ist oder hast Du zum Posten gekürzt?
Hilft es, wenn Du testweise eine garantierte VKE-Abgrenzung vor den Vergleich einbaust?
Code:
//-----------------------------------
//Auf endzeichen ueberpruefen 
//-----------------------------------
[COLOR=#ff0000]CLR                    // <-- VKE-Abgrenzung (SET geht auch)[/COLOR]
L     W#16#0D0A        // Prüfen ob WertX nächste Runde auftritt     
L     DBW [AR1,P#2.0]  [COLOR="#FF0000"]// Ist hier der richtige DB geöffnet? Welche Adresse ist in AR1?[/COLOR]
==I         
SPB   opei

Harald
 
Wenn ich den loopzahler erhoher überschreibt des AR mir dies Werte die nachträglich benötige,
Also ja,
-AR1/2 zeigen weiterhin auf das DB,
-Der Richtige DB wird im Programm anfang des FC geöffnet (siehe Code unten),
-DB ist groß genug "1324 Byte" (ansosten würde ich auch ein fehler erhalten)

Im Puffer wird nichts eingetragen

Das Programm ist identisch bis auf "L WertX" was durch "L W#16#0D0A" ersetzt wird, zudem habe ich davor und danach einige sachen stehen
zB.
Code:
TAR1 inhaltAR1 // sichern von AR1
TAR2 inhaltAR2 // sichern von AR2
AUF DB 250

      L     P#1050.0 Pointer auf DB250.DBB1050.0
      LAR1  
      L     P#536.0 //Pointer auf DB250.DBB536.0
      LAR2  

//--------------------------
/// Werte mit "0 füllen
//--------------------------

      L     256
Sch4: T     #loopzahler
      L     0
      T     DBB [AR1,P#0.0]
      T     DBW [AR2,P#0.0]
      L     P#1.0
      +AR2  
      +AR2  
      +AR1  
      L     #loopzahler
      LOOP  Sch4

L P#0.0 // 
L AR1
L P#22.0 // Pointer auf DB250.DBB0.0
LAR2

L #Slave
T DBB[AR1, P#0.0]
L 
.....


Was ist eine VKE Abgrenzung und was soll dies bewirken?
 
Zuletzt bearbeitet:
VKE-Abgrenzung: Statusbit /ER auf 0 setzen, so daß garantiert eine neue VKE-Verknüpfungskette begonnen wird und nicht ein vom vorherigen Programmablauf versehentlich "eingeschlepptes" VKE mitverknüpft wird.

Bei ==I ist der vorherige Zustand des VKE und des /ER aber eigentlich egal, es überschreibt immer das vor der Operation vorhandene VKE


Hat Dein Programm das Problem auch in PLCSIM?

Ist das Deine CPU: CPU 412-5H PN/DP 6ES7412-5HK06-0AB0 ?
Siemens empfiehlt "möglichst zeitnah" ein Firmwareupdate auf V6.0.5 durchzuführen.
Frage doch mal den Siemens Support, ob denen das Verhalten Deiner CPU bekannt ist.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei PLC Sim lief das Programm ohne fehler aber an der CPU waren einige sachen nicht so wie erwartet. darunter auch die Schleife.
Ja das ist meine CPU
Du denkst aber das es auf dem ersten Blick nicht mit dem Programm zu tun hat?
Könnte so ein fehler an einem Update liegen?
Ich teste das mit dem VKE und schreibe mal den Support an und sobald ich antowort erhalte melde ich mich wieder.

Danke
Gruß Erick
 
Also im Programm kann ich eigentlich auch nichts entdecken, nachdem wir alle Randbedingungen (FC,FB,...) abgeklärt haben.
Wenn es im PLCSIM läuft und in der CPU nicht, dann ist das schon ein komisches Zeichen.
 
Also an dem gezeigten Programm kann ich auch nichts falsches entdecken. Ist schon merkwürdig.

Ich würde wohl noch testweise den Vergleichscode umformulieren:
Code:
CLR
L     W#16#0D0A        // Prüfen ob WertX nächste Runde auftritt
L     DBW [AR1,P#2.0]
<>I         
SPBN  opei
oder auch mal so:
Code:
NOP   0
CLR
AUF   DB250
L     DBW [AR1,P#2.0]
L     W#16#0D0A        // Prüfen ob WertX nächste Runde auftritt
==I         
SPBN  nxt
SPA   opei
nxt: L P#1.0
oder
Code:
SET
L     W#16#0D0A        // Prüfen ob WertX nächste Runde auftritt
L     DBW [AR1,P#2.0]
-I
SPZ   opei

Sind das eigentlich 2 CPUs? Und haben die beide die selbe Firmware-Version?

Harald
 
Zurück
Oben