S7 315DP2 Daten durchleiten

Zuviel Werbung?
-> Hier kostenlos registrieren
L L#4 lädt eine DINT 4.
L P#4.0 ist ja nicht verkehrt, das Ganze war für dich als Erklärung gedacht.
Wie lange steht denn der "Trigger Keyence" an? Solange der da ist, wackelt dein Programm immer durch die Schleife. Das führt u.U. zu einer Zykluszeitüberschreitung, falls der Trigger länger ansteht, als die max. Zykluszeitüberwachung (siehe Hardwarekonfig) dies erlaubt. Daher schau doch mal in den Diagnosepuffer der SPS, was die genaue Stopursache ist, dazu ist der ja prima geeignet. Die Stelle der zuletzt geschriebenen Daten mußt du dir schon selber merken. Daher rechne ich im allgemeinen nicht mit den Pointern direkt, sondern zähle einen Index hoch, aus welchem ich dann jeweils den Pointer berechne. Mit dem Index kann man sich ganz gut merken wo der letzte Schreibzugriff stattgefunden hat. Geht auch mit dem Pointer, dieser ist aber nicht so anschaulich, wie ein Index aus einer Int.
 
Hi Ralle,

Ja klar, aber funktioniert ja beides, ob Pointer direkt laden oder so...
und auf diesem Wege präge ich mir das besser ein und kann dann wenn erforderlich den flexibleren Weg gehen (Volker`s Fred)

Danke dann ist klar warum die SPS abgekraxelt ist...
Die Zykluszeitüberwachung stand auf 150ms...

Habe das jetzt Zyklusunabhängig aufgebaut und der Hinweg funktioniert einwandfrei!
Code:
  U     "Trigger Keyence"
      SPBN  LOW                         //Wenn VKE = 0 ->Sprungbefehl

      L     MW    38                    //Vergleicher um im ARRAY of REAL fortlaufend zu pointen
      L     0
      >I    
      SPB   JUMP                        //Überspringt den Pointer auf REAL Adresse 0-3Byte im DB[X]

      L     L#0                         //Läd eine DINT 0
      SLD   3                           //Verschieben um 3 Bit nach links erzeugt Pointer
      T     MD    40                    // Transferiere Pointer in MD 40


JUMP: L     1                           //Läd Integere Ganzzahl 1 für DB
      T     MW    24                    //und transferiert sie in MW 24

      U     M      6.6
      SPBN  TIME                        //Wenn Trigger Meßwert nicht kommt überspringe Transfer
      AUF   DB [MW 24]                  //DB Nummer 1 (Integere aus MW24), für Programmerweiterung - flexibel


      L     MD    34                    // Ergebnis aus Berechnung NW1
      T     DBD [MD 40]                 //ARRAY of REAL, Anfang bei Byte 0

      L     L#4                         //Läd eine DINT 4
      SLD   3                           //Verschieben um 3 Bit nach links erzeugt Pointer
      L     MD    40                    //Transferiert Pointer in MD
      +D                                //addiert die Bytes auf MD 40 (eine REAL Adresse rauf)
      T     MD    40                    //transferiert die neue Adresse in MD 40

      L     MW    38                    //Schleifenzähler mit MW
      L     1
      +I    
      T     MW    38



TIME: NOP   0                           //Verschleifen mit Kette / TIME abwarte bis Impuls Messwert kommt
LOW:  NOP   0                           //Überspringen des Ablaufes

Und das ist mein Rücksetzweg, sprich ich überschreibe das MW für den Schleifenzähler und das MD sprich den Pointer einfach mit 0 aus einem nicht benutzten MW bzw. MD.
Weiß nicht ob man das so macht und ob es da elegantere Wege gibt aber es funtioniert...
Code:
  U     "Trigger Keyence"
      FN    M      6.7
      SPBNB _003
      L     MW    45
      T     MW    38
_003: NOP   0

neues NW
  U     "Trigger Keyence"
      FN    M      6.7
      SPBNB _005
      L     MD    47
      T     MD    40
_005: NOP   0
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Sieht ja gleich viel besser aus und funktioniert offensichtlich auch.

Und das ist mein Rücksetzweg, sprich ich überschreibe das MW für den Schleifenzähler und das MD sprich den Pointer einfach mit 0 aus einem nicht benutzten MW bzw. MD.
Weiß nicht ob man das so macht und ob es da elegantere Wege gibt aber es funtioniert...

Warum aus einem nicht benutztem Merkerwort? Du kannst doch auch einfach 0 laden und in das MD transferrieren.

Code:
L L#0
T MW 38
T MD 40

Und für den Flankenmerker nicht 2x M6.7 verwenden.
Ok, mit dem Code oben brauchst du nur noch einen Flankenmerker, aber trotzdem.

PS: Ich glaube, das wurde ja gerade in einem anderen Thread geklärt.
 
Hast recht Ralle!

Ist viel einfacher...
Dank dir!
Habe es jetzt abgeändert:
Code:
 U     "Trigger Keyence"
      FN    M      6.7
      SPBNB Rev1
      L     L#0
      T     "Pointer"
      T     "Loop counter"
Rev1: NOP   0

Ich möchte jetzt noch eine Überwachung der Schrittkette Auto basteln, bei der die Anzahl der Fehler die am Tag auftreten in einen DB gespeichert werden. Mit MW hier reicht ja Intere... hoffe ich doch mal schwer *g*
Wollte mit dem OB 35? agieren... jeden Tag einen Alarm der mir den Pointer einen rauf setzt und in die nächste Zeile des Arrays die Fehleranzahl schreibt... Kann dann auch von der IT ausgelesen werden...
Werd das jetzt mal probieren..

Ich habe für die Schrittkette, Hand und für OB1 einen Grafcet erstellt.
Aber was mache ich für meinen FC mit Datenhandling? Einen PAP?
Darf man das? Macht man das so?

Ich bin zwar ein paar mal kurzzeitig verzweifelt aber das macht richtig Spass :)
 
Zurück
Oben