Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Abfrage eines Fehlerdatenbausteines mittels eines Funktionsbausteines

  1. #1
    Registriert seit
    06.12.2011
    Beiträge
    44
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Ihr,

    ich habe schon fleißig die Suchfunktion bemüht. Dabei habe ich auch die Funktion von Loop und Pointer entdeckt.
    Mit Hilfe dieser wollte ich mir jetzt eine Schleife basteln, welche die im Baustein angelegten Word - Variablen auf 0 prüft.
    Dies soll dazu dienen um für das spätere Programm eine Sammelstörmeldung zu erzeugen.
    Hier für benütze ich folgenden Code:

    Code:
          L     #DB_Nr
          T     #Aux_DB_Nr
    
          AUF   DB [#Aux_DB_Nr]
          L     DBLG
          T     #Length_DB
    
          L     #Length_DB // hier möchte ich die richtige Länge für meine Loop Schleife erzeugen
          L     2
          -I    
          L     2
          /I    
          T     #Length_DB
    
    
          L     #Length_DB
    Next: T     #Loop_Count
    
          L     #Loop_Count
          L     2
          *I    
          SLD   3
          LAR1  
          L     DBW [AR1,P#0.0]
          L     W#16#0
          <>I   
          =     #Collecting_Disturbance
    
          LOOP  Next
    Sobald ich diesen in die CPU lade und ausführe bekomme ich die im beigefügten Bild angezeigte Fehlermeldung.


    Fehlermeldung.JPG


    Wenn ich vom Diagnosepuffer zum Baustein springe, springt er an die Stelle, wo über den Pointer das Datenwort geladen wird.


    Könnt ihr mir weiter helfen, wo hier der Fehler liegt? Ich bin mit meinem Latein etwas am Ende

    Grüße Daniel
    Geändert von DDuesentrieb (04.06.2014 um 10:18 Uhr)
    Zitieren Zitieren Abfrage eines Fehlerdatenbausteines mittels eines Funktionsbausteines  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    [EDIT]falsche Antwort[/EDIT]

    ändere
    Code:
     *I
    in
    Code:
     +I
    [EDIT] wie Ralle im Folgenden richtig bemerkt, ist das nicht des Pudels Kern [/EDIT]
    Geändert von vierlagig (04.06.2014 um 10:34 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    DDuesentrieb (04.06.2014)

  4. #3
    Registriert seit
    06.12.2011
    Beiträge
    44
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Vielen Dank für die schnelle Antwort daran hat es gelegen!

    Jetzt bekomme ich nur eine Zyklus Überschreitung. Der Loop wird 26 mal ausgeführt.
    Ist das schon zu viel?

  5. #4
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Mr.XX Beitrag anzeigen
    Vielen Dank für die schnelle Antwort daran hat es gelegen!

    Jetzt bekomme ich nur eine Zyklus Überschreitung. Der Loop wird 26 mal ausgeführt.
    Ist das schon zu viel?
    Deine Schleife zählt nicht zurück, es fehlt ein
    Code:
    L   #Loop_Count
    vor
    Code:
    LOOP Next
    Geändert von vierlagig (04.06.2014 um 10:28 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  6. Folgender Benutzer sagt Danke zu vierlagig für den nützlichen Beitrag:

    DDuesentrieb (04.06.2014)

  7. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    @4L
    Deinen Vorschlag (+I statt *I) halte ich für falsch, er will ja das DW adressieren.
    Bei Länge des DB von 22 steht in seinem LoopCount eine 10.
    Also muß er diesen auch wieder mit 2 multiplizieren, um auf die richtige Adresse zu kommen oder übersehe ich etwas?
    26 Schleifen sollte die SPS locker machen oder sie ist mit der Zykluszeit auch ohne deinen Code schon an der oberen Grenze angelangt.

    = #Collecting_Disturbance

    geht nicht, du würdest das letzte Ergebnis, bevor du aus der Loop dringst erhalten. Also besser

    S #Collecting_Disturbance

    und dann vor der Loop Rücksetzen.

    Hier mal ein kleines Code-Beispiel, ist schon älter, wird aber nie angefasst, da es so läuft, Länge ist hier fest, kann man ja variabel machen…
    Da wird eine Variable hochgezählt für die Anzahl der DW, die <> 0 sind, aber man könnte auch gleich ein S Merker x.y nutzen.

    Code:
          AUF   "STOERMELDUNGEN DB"
    
    
          L     P#0.0
          T     #pointer_1
    
    
          L     0
          T     #result
    
    
          L     64                          //count of messages 
    SC02: T     #INTcounter
    
    
          L     DBW [#pointer_1]            // load word
          L     0                           // load 0
          ==I                               // no errormessage !!!
          SPB   NUL2
          L     #result
          L     1
          +I    
          T     #result
    
    
    NUL2: NOP   0                           // pointer +1 next WORD
          L     #pointer_1
          L     P#2.0
          +D    
          T     #pointer_1
          L     #INTcounter
          LOOP  SC02
    
    
          L     #result
          L     0
          <>I   
          =     "M1.0 main error"
    Geändert von Ralle (04.06.2014 um 10:31 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  8. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    DDuesentrieb (04.06.2014)

  9. #6
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    @4L
    Deinen Vorschlag (+I statt *I) halte ich für falsch, er will ja das DW adressieren.
    Bei Länge des DB von 22 steht in seinem LoopCount eine 10.
    Also muß er diesen auch wieder mit 2 multiplizieren, um auf die richtige Adresse zu kommen oder übersehe ich etwas?
    ich gebe zu, dass das durchaus ein Problem sein könnte ...
    lange nicht mehr gepointert ;o)

    also ja: die Adresse berechnet sich mit 2*Loop_Count

    das Problem hier war ja offensichtlich auch ein anderes... die nicht funktionierende Schleife
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  10. #7
    Registriert seit
    06.12.2011
    Beiträge
    44
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Vielen Dank für eure schnellen und hilfreichen Antworten!

    @Ralle

    Danke für dein Code - Beispiel, dass werde ich mir jetzt mal anschauen

    Grüße

    Daniel

  11. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Zitat Zitat von Mr.XX Beitrag anzeigen
    Vielen Dank für eure schnellen und hilfreichen Antworten!

    @Ralle

    Danke für dein Code - Beispiel, dass werde ich mir jetzt mal anschauen

    Grüße

    Daniel
    Sollte auch mit deinem Code gehen, wenn du den letzen Post von 4L berücksichtigst.
    Bei mir ist der ind. Zugriff anders geschrieben, aber man kann beides nutzen.
    #pointer_1 ist ein DWORD
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  12. #9
    Registriert seit
    06.12.2011
    Beiträge
    44
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hier nochmal mein kompletter Code, falls jemand auf das Thema stößt.
    Hab die Abfrage von dem Datenwort 0 noch von Hand eingefügt, da dieses durch den Loop nicht
    durchlaufen wird.

    Code:
          L     #DB_Nr
          T     #Aux_DB_Nr
    
          AUF   DB [#Aux_DB_Nr]
          L     DBLG
          T     #Length_DB
    
          L     #Length_DB
          L     2
          -I    
          L     2
          /I    
          T     #Length_DB
    
    
          CLR   
          =     #Collecting_Disturbance
    
          L     #Length_DB
    Next: T     #Loop_Count
    
          L     #Loop_Count
          L     2
          *I    
          SLD   3
          LAR1  
          L     DBW [AR1,P#0.0]
          L     W#16#0
          <>I   
          S     #Collecting_Disturbance
    
          L     #Loop_Count
          LOOP  Next
    
    
          L     DBW    0
          L     W#16#0
          <>I   
          S     #Collecting_Disturbance

  13. #10
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Mr.XX Beitrag anzeigen
    Hier nochmal mein kompletter Code, falls jemand auf das Thema stößt.
    Hab die Abfrage von dem Datenwort 0 noch von Hand eingefügt, da dieses durch den Loop nicht
    durchlaufen wird.
    es wäre fatal, wenn es tatsächlich so wäre!
    Geändert von vierlagig (04.06.2014 um 11:21 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 01.11.2013, 20:36
  2. Antworten: 14
    Letzter Beitrag: 21.10.2012, 11:39
  3. Antworten: 27
    Letzter Beitrag: 09.02.2011, 10:29
  4. Abfrage eines DB in SCL.Warum geht es nicht
    Von Gerold im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 31.10.2005, 09:40
  5. Antworten: 2
    Letzter Beitrag: 09.08.2003, 21:24

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •