Step 7 DB auslesen

spezies-8472

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Vorab - ich habe rauf und runter gesucht im Forum, aber als absoluter S7 Einsteiger kann ich mit speziellen Lösungen leider (noch) nichts anfangen :-(
Mein Problem:
Ich habe einen DB1 mit 23 Werten (eine Erweiterung ist denkbar).
Alle 2 Sekunden soll nun 1 Wert aus dem DB ausgelesen werden (Word) und an ein Ausgangswort übergeben werden (AW0) und dort 2 Sekunden anliegen, ehe der folgende Wert aus dem DB ausgelesen wird und auf das AW geschrieben wird.
Wenn alle 23 Werte gelesen und geschrieben wurden, soll der Zyklus wieder von vorne beginnen.

Also ich bin in meinen Überlegungen bei einem Pointer angekommen, der alle 2 Sekunden weiter rückt auf das nächste Word im DB. Eventuell kriege ich sogar noch eine simple Schleife in AWL zusammengebaut, obwohl AWL so gar nicht mein Ding ist, aber wie realisiere ich die 2 Sekunden Wartezeit ohne großen Aufwand und WIE lese ich die Werte aus dem DB aus??

Im Prinzip soll ein Bitmuster, welches im DB hinterlegt ist, auf das Ausgangswort übertragen werden.

In meiner altbewährten OMRON-SPS wäre das für mich jetzt kein so großes Problem, aber da geht das eben VÖLLIG anders...
Hat jemand eine Idee, oder kann es mir vielleicht sogar nachvollziehbar dokumentiert in AWL zeigen?
 
Pointeradressierung ist im FAQ des Forums sehr gut beschrieben, schau da mal rein.
Für Schleifen nutzt man den LOOP-Befehl, das findest du sehr gut in der Step7-Hilfe, also Baustein in Step7 auf, LOOP eingeben, Doppelklick darauf mit der Maus und F1.
Damit hättest du das Rüstzeug, um erst einmal zu starten.
Bei Problemen mit der Umsetzung kannst du hier deinen Code posten und Fragen stellen, da wird dir garantiert recht fix geholfen.

PS: Hier mal eine Anregung aus dem Forum: http://www.sps-forum.de/simatic/61947-programmschleife.html

Die Suche mit dem Stichwort "LOOP" ergibt auch so einige Hinweise.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle - danke für den Tipp, aber - fasse es bitte nicht als frech auf!! - auch für den Mod gilt: wer lesen kann... ;-)

Ich habe ja oben geschrieben, dass ich eben NICHTS mit den Beispielen anfangen kann, ich habe Pointer, Loops usw. und auch Beispiele gefunden, aber ICH VERSTEHE sie nicht, da mir einfach das Verständnis für AWL fehlt und ich begreife diese Erklärungen einfach nicht. Tut mir sehr leid, wenn ich sie verstehen UND noch dazu umsetzen könnte, müsste ich nicht fragen, aber eben DAS ist mein Problem - ich kriege in AWL nichts zusammen und auch die Hilfe von Siemens geht offenbar über meinen Horizont! Ich kann Dir das Problem mit ner OMRON-SPS recht schnell schreiben, aber leider MUSS es diesmal Siemens sein...
Aber okay, wenn mir nur geholfen werden kann, wenn ich schon was fertiges habe, dann bin ich vielleicht doch falsch hier, dann sorry für die Störung!
 
Hallo spezies,

die zwei Sekunden Wartezeit kannst du mit einem einfachen Timer realisieren der nur jeweils einen Zyklus Highsignal liefert und automatisch neu startet (oder einem Sekundetakt der hochgezählt und verglichen wird). Die Werte aus dem DB kannst du mit einem Lesebefehl bekommen und an das Ausgangswort Transferieren. Wofür du eine Schleife benutzen willst ist mir nicht ganz klar.

Gruß

Volker
 
HALLO V W,
na ganz einfach - im DB sind 23 Worte mit verschiedenen Werten belegt. Ich will das 1. Wort auslesen und aufs AW 0 schreiben
also wenn da im 1. DBW bspw. 10101010 10101010 steht, sollen auch die Ausgänge A0.0-A1.7 mit 10101010 10101010 beschrieben werden...
nach 2 Sekunden soll das 2. DBW gelesen werden, in dem vielleicht 00110011 00110011 steht und damit die Ausgänge beschrieben werden
nach weiteren 2 Sekunden das 3. DBW, dann das 4. und so fort und nach Wort 23 startet alles wieder bei DBW1...
Das Programm soll möglichst kurz und kompakt werden.
Natürlich kann ich jedes einzelne Wort im DB mit nem MOVE auslesen, keine Frage, aber dann habe ich 23x MOVE, was ich vermeiden möchte.
Wenn der DB demnächst auf 123 Werte vergrößert wird, ändere ich in der Schleife den Zähler und gut - in FUP muss ich 100 neue MOVE zufügen.

Wenn es natürlich eine andere Lösung der indirekten Programmierung zum Auslesen des DB gibt, so würde die mich auch interessieren, nur weiß ich nicht, ob das in S7 überhaupt geht!?
Und wie ich mir nen 2-Sekundentakt in FUP realisiere ist schon klar, sorry, habe ich oben nicht dazu geschrieben.
Da ich davon ausgehe, dass so eine Pointerprogrammierung nur in AWL möglich ist, sollte die Datenausgabe, also das Schreiben aufs AW0 und auch die Wartezeit für den nächsten Schleifendurchlauf in AWL erfolgen - würde zumindest Sinn machen.

Leider komme ich mit "Probiere mal nen Loop, hier sind sehr gute allgemeine Beispiele im Forum zu finden..." nicht weiter, denn das habe ich schon versucht. Mir fehlen da offenbar grundlegende Kenntnisse in der AWL Programmierung und ich kriege kein halbwegs laufendes Programm zusammen. Ich kann mir ein Beispiel kopieren und das wars dann schon... wenn es nicht läuft, kann ich bisher nicht nachvollziehen, was ich falsch mache.

Trotzdem Danke für Deine Infos!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
      UN    M      2.1
      UN    M      2.0                  // Neustartmerker
      L     S5T#2S
      SE    T      1

      U     T      1
      =     M      2.1

      SPBN  _101
      L     MW   100
      L     1
      +I    
      T     MW   100

      L     23                          // deine Länge
      >=I   
      SPBN  _101
      L     0
      T     MW   100
_101: NOP   0

      L     MW   100

      SLD   4
      LAR1  

      AUF   DB     1                    // dein DB
      L     DBW [AR1,P#0.0]
      T     AW     0                    // dein Ausgangswort
 
Hallo Dotzi - das ist schon alles? Wow, das muss ich mir mal in Ruhe zu Gemüte führen! Auf jeden Fall vielen Dank für Deine Mühe. Irgendwie ist es echt hilfreich, wenn man in AWL denken kann ;-)
So wirklich verstehen tue ich es nicht, aber es funktioniert. Dankeschön!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der verständlichkeit halber für einen laien sollte man das besser anders schreiben

Code:
      L     MW   100
      SLD   4
      LAR1  
      AUF   DB     1                    // dein DB
Code:
L MW 100
L 2 //da wortzugriff
*I //akku enthält nun die adresse
SLD3 //pointer erzeugen
 
Zurück
Oben