AWL: Fehler bei Vergleich -> Sprung

bertiger

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

Ich bin Neuling in der SPS-Programmierung und diesem Forum und stelle für, wie ich annehme meist erfahrene User, wahrscheinlich ...blöde Fragen. Aber da ich nun schon seit längerem auf dem Schlauch sitze und einfach nicht lokalisieren kann wo der Hund begraben liegt, blieb mir in meiner Verzweiflung nichts anderes übrig!
Nun - jeder fängt mal klein an und ohne Fehler oder Fragen hat es bestimmt auch noch kaum jemand geschafft. Also komme ich mal zum Wesentlichen:
Ich arbeite auf einer S7-300, CPU315-2DP mit Softwareversion 5.1 und habe ein Problem mit dem nachfolgend ersichtlichen AWL-Code.

Code:
      AUF   "DBxx"

      L     0                           
      T     #z                          
      L     20                          
M001: T     #S_ZAE                      
      L     #S_ZAE                      
      L     1                           
      -I                                 
      L     2                           
      *I                                
      SLW   3                           
      T     #platz                      
      L     DBW [#platz]                
      L     #mat                        
      ==I                               
      SPBN  M002                        
      L     #z                          
      L     1                           
      +I                               
      T     #z                          
M002: L     #S_ZAE                      
      LOOP  M001                        
      L     #z                          
      T     #anz

Der Hintergrund:
In einem Datenbaustein sind als Beispiel 20 verschiedene Zahlen vom Typ WORD gespeichert. Der Inhalt dieser Datenbausteinworte soll mittels einer Schleife mit der Eingangsvariable mat, ebenfalls vom Typ WORD, verglichen werden. Bei erfüllter Bedingung soll die temporäre Variable z um 1 inkrementiert werden. Bei nicht erfüllter Bedingung Sprung zu M002 und wiederholen der Schleife bis zum Ende. Am Schluss soll dann lediglich der Inhalt der Variablen z auf den Ausgang gelegt und somit anderen Funktionen zur Verfügung gestellt werden.
Und jetzt banal gesprochen: Ich möchte den Inhalt eines Datenbausteins nach bestimmten Kriterien(Zahlen) durchsuchen und die Anzahl der gefundenen Stück weiterverwenden!

Nur irgendwie scheint die Funktion durchzulaufen, liefert aber kein Ergebnis bzw. keine Stückzahl wie oft bspw. die Zahl 3 gefunden wurde!

Ich bin sicher irgendjemand kann und wird mir helfen und bedanke mich schon im Voraus herzlichst für Eure Unterstützung!
 
Hallo bertiger,

der Code ist soweit OK!
Es darf der Baustein allerdings nicht Zyklisch aufgerufen werden.
Es müsste am Anfang z.B.

U M0.0
FP M0.1
= M0.2
BEB

...... Restlicher Code.


Jetzt sollte der richtige Zahlenwert bei jeder pos. Flanke richtig angezeigt werden.

MfG
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der Code an sich sollte eigentlich funktionieren.
Ich würde an folgenden Punkten schauen:
- wo liegen die Werte im DB, vergleichst du vielleicht die falschen DWs?
- wie wird der Programmteil aufgrufen und mit dem Vergleichswert versorgt?
- dito wie wird das Ergebnis "entsorgt"?

ein paar kleine Tips noch, vielleicht kannst du ja mit einem
davon was anfangen :wink:

Code:
M001: T     #S_ZAE                      
      L     #S_ZAE 

das Laden ist nicht nötig, der Wert des Schleifenzählers steht
noch im Akku 1

L     2                            
*I                                
SLW   3      

SLW 4 
macht das gleiche

==I                                
SPBN  M002       

<>I
SPB M002 
erspart dem Gehirn einmal invertieren.

wenn ich Konstanten addiere oder subtrahiere verwende
ich immer "+ Konstante" das ist schneller und weniger Schreibarbeit, 
es sei den ich will die die Anzeigen auswerten, dann geht das natürlich
nicht.
[/quote]
 
spz schrieb:
- wo liegen die Werte im DB, vergleichst du vielleicht die falschen DWs?
Ich hab mal einen Test-DB erstellt der nur 20 Wörter enthält aber auch damit liefert er nichts zurück

- wie wird der Programmteil aufgrufen und mit dem Vergleichswert versorgt?
Der Programmteil steht im Augenblick als einzelne Funktion und wird auch so aufgerufen. Der Vergleichswert wird variabel als WORD eingelesen.

- dito wie wird das Ergebnis "entsorgt"?
Das Ergebnis, meine enthaltene Anzahl, wird lediglich einem Ausgang zugewiesen, der in einem FB weiterverwendet wird.

ein paar kleine Tips noch, vielleicht kannst du ja mit einem
davon was anfangen :wink:

Code:
L     2                            
*I                                
SLW   3      

SLW 4 
macht das gleiche
-- so hab ich das noch gar nicht betrachtet...aber klingt logisch ;-) --

==I                                
SPBN  M002       

<>I
SPB M002 
erspart dem Gehirn einmal invertieren.
-- Stand bereits in der Vorversion und funktionierte ebensowenig. Daher der Test mit der Hirnverbiegung! --

wenn ich Konstanten addiere oder subtrahiere verwende
ich immer "+ Konstante" das ist schneller und weniger Schreibarbeit, 
es sei den ich will die die Anzeigen auswerten, dann geht das natürlich
nicht.
Vielleicht kommst Du ja jetzt noch auf eine andere Idee. Trotzdem schon mal Danke Günter!
 
Hallo bertiger,

die Antwort von vorhin is a Schmarn, da war das Hirn langsamer als die Finger.
Hab deinen Baustein-Code mal in PLC-Sim getestet, funktioniert ohne Probleme.
Ist es möglich den Baustein in dem dieser Code bzw. Baustein aufgerufen wird in das Forum zu stellen.

MfG
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo bertiger,

würde natürlich auch so funktionieren.

Code:
      L     P#0.0
      T     #platz

      AUF   DB    20

      L     0
      T     #z

      L     20
M001: T     #S_ZAE

      L     DBW [#platz]
      L     #mat
      <>I   
      SPB   M002
      L     #z
      L     1
      +I    
      T     #z

M002: L     #platz
      L     P#2.0        // Versatz um ein Word
      +D    
      T     #platz

      L     #S_ZAE
      LOOP  M001
      L     #z
      T     #anz

MfG
Daniel
 
Hallo Daniel,

leider fehlt das "Drumherum" im Augenblick noch. Deshalb habe ich den Programmteil, den ich gepostet habe, als eigenständige Funktion verwendet und diese derzeit zum Testen im OB lediglich mit der Variablen "mat" vom Typ WORD und manuell wechselnden Werten versorgt! Der aufgerufene Test-Datenbaustein enthält analog zur Programmschleife 20 Wörter mit Werten die natürlich auch von mat geliefert werden (nach was suchen, was nicht da ist vertreibt zwar manchmal schön die Zeit, bringt einen im Regelfall jedoch kaum weiter).
Ich habe also praktisch gesehen sogar bis auf 1OB, 1FC im OB und 1DB reduziert und dennoch haut das bei mir nicht hin wie ich es erwarte!

Gruß,
bertiger
 
Hallo bertiger,

hab mal mein Testprojekt angehängt.

MfG
Daniel
 

Anhänge

  • project.zip
    31,7 KB · Aufrufe: 13
Hallo nochmal,

ich hab jetzt etwas gespielt und das Program auch entsprechend den erhaltenen Hilfen verändert. Gleichzeitig habe ich noch einen DB mit wirklich 20 einzeln beschriebenen Feldern aufgerufen. Dennoch erhalte ich keine Anzahl am Ausgang.
Vielleicht kann mir mit Hilfe der angehängten Screenshots noch jemand sagen, wo das Problem zu suchen ist!

Gruß,
bertiger
 

Anhänge

  • fc_db.jpg
    fc_db.jpg
    66,2 KB · Aufrufe: 77
Zuviel Werbung?
-> Hier kostenlos registrieren
füg mal nach dem loop m003 ein paar leerzeilen ein und scrolle den bildschirm soweit das loop nicht mehr zu sehen ist.

dann jeht dat. :wink:

aber frag mich nicht warum das so ist. ich habe das auch schon öfter in diversen bausteinen gehabt. der code funktioniert aber.
 
Du hast den DB nur mit den Anfangswerten gezeigt, gehe doch mal Online im DB und sieh nach, ob auch die realen Werte in der SPS so vorhanden sind. Ansonsten Datenbausteim neu initialisieren und in die SPS übertragen.
 
Hallo,

der Fehler in deinem erstem Beispiel ist das du nach dem Loop Befehl und dem Sprung zurück nochmals 1 abziehst. Das macht der Loop Befehl selbst schon. So wird bei dir nur jedes 2te Wort bearbeitet.

Torsten
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, mit der -1 erreicht er nur einen Versatz um ein Datenwort, sonst würde er beim 1. Mal auf DW40 zugreifen, das es nicht gibt. Da der um 1 verringerte Wert nicht wieder zurückgeschrieben wird geht das.
 
Hello again....ich sag immer wieder...

Spaß beiseite, denn mir ist im Augenblick nicht gerade zum Lachen zumute! Allerdings habe ich jetzt festgestellt was funktoniert bzw. was nicht!
Sobald ich die Werte, die die einzelnen DBW's enthalten, aus dem Programm oder einer anderen Funktion heraus in den DB schreibe kann die Schleife anscheinend auch den Inhalt finden. Meine Frage dazu lautet jetzt aber: wieso gibt es einen Anfangswert, wenn er sowieso nicht berücksichtigt wird?
Gut, für mein Vorhaben im Augenblick kein Problem - schreib ich die Werte halt so rein - aber mal generell: das macht doch keinen Sinn! Oder was habe ich vergessen zu beachten?

Gruß,
bertiger
 
Habs geahnt :cry: .
Die Anfangswerte wirken nur beim ersten Mal, wenn also der DB noch nicht in der SPS existiert und dann übertragen wird. Wenn du den DB in der Datenansicht öffnest und dann "Bearbeiten/Datenbaustein initialisieren" machst, werden die Anfangswerte in die Aktualwerte übertragen. Anschließend in die SPS übertragen und es sollte funktionieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, das hört sich vernünftig an! Wieso hat mir das denn keiner vorher gesagt? Leider gehörte das nicht zu meinem SPS-Grundwissen. :?
Ich werd's demnächst versuchen. Im Augenblick komm ich leider nicht dazu.

Jedoch bereits eines Vorneweg:

Herzlichen Dank an Alle die sich mit mir und meinem Problem abgeärgert und dennoch nicht die Geduld verloren haben!!
 
Zurück
Oben