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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Überprüfen: Programm mit Schleife zum Vergleich eines Werts mit Werten in DB

  1. #1
    Registriert seit
    16.06.2010
    Beiträge
    18
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich möchte einen Wert derüber eine Schnittstelle eingelesen wird mit Werten die in einem DB hinterlegt sind Vergleichen. Wenn ein Positiver Vergleich erfolgt, soll ein Bit gesetzt werden und der entsprechende Wert gespeichert werden.
    Dazu habe ich folgendes Programm geschrieben, bin mir aber vorallem bei der indirekten Adressierung nicht sicher, könnte bitte jemand mal drüber schaun,mir fehlt momentan leider jede testmöglichkeit.

    Code:
     L     P#0.0
          LAR1  
          AUF   #DB_nummer
          L     0
    M001: T     #S_ZAE
          L     DBW [AR1,P#0.0]
          L     #Can_msg
          ==I   
          SPB   M002
          +AR1  P#2.0
          L     #S_ZAE
          L     DBLG
          ==I   
          BEB   
          L     #S_ZAE
          L     2
          +I    
          LOOP  M001
     
    M002: S     #treffer
          L     DBW [AR1,P#0.0]
          T     #code
    S_ZAE (INT)ist der Schleifenzähler, treffer das bit das gesetzt werden soll und in code(WORD) soll der wert gespeichert werden im fall eines treffers.
    Can_msg(WORD) enthält den wert auf den der Verglech erfolgen soll.
    Zitieren Zitieren Überprüfen: Programm mit Schleife zum Vergleich eines Werts mit Werten in DB  

  2. #2
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.628
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    Auf den ersten Blick sieht alles gut aus, allerdings finde ich Deine Schleife etwas eigenwillig programmiert.
    Gruß
    Michael

  3. #3
    Registriert seit
    21.01.2008
    Ort
    Lippe
    Beiträge
    317
    Danke
    43
    Erhielt 49 Danke für 46 Beiträge

    Standard

    Hallo,
    dein Schleifenzähler muß meiner meinung nach am Anfang mit der Anzahl der Worte die verglichen Werden soll gefüttert werden, dann vorm Loop aufgerufen werden, da das Loop ihn dann um einen verringert

    Code:
    L 10 // Beispiel für 10 Durchläufe
    next: T #Schleifenzähler
    .
    .Programm
    .
    L #Schleifenzähler
    LOOP next
    ***************************************

    Sonnige Grüße online


    Wegen hübschen Frauen kaufen wir Bier, wegen häßlichen Frauen trinken wir Bier...

  4. #4
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.628
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    @online
    So, wie ibanesch es programmiert hat, ist es zwar sehr ungewöhnlich, müsste aber funktionieren.
    Gruß
    Michael

  5. Folgender Benutzer sagt Danke zu M-Ott für den nützlichen Beitrag:

    online (13.01.2011)

  6. #5
    ibanesch ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    16.06.2010
    Beiträge
    18
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke für eure schnellen Antworten.
    Bei dem Teil:
    Code:
     +AR1  P#2.0
    und bei dem

    Code:
    L     DBW [AR1,P#0.0]
    kann mir einer erklären ob ich da dann immer im DB um 1 Word weiter springe, bzw warum das so funktioniert.

  7. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.797
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Ja ... du erhöhst den AR1 mt den Befehl um 2 Byte (= 1 Wort) und du liest das durch das AR1 adressierte Wort. Das ",P#0.0" ist als zusätzliches Offset zu stehen - manchmal kam man das auch ganz gut gebrauchen.

    Beispiel :
    Code:
    L     DBW [AR1,P#0.0]
    T     DBW [AR1,P#2.0]
    lädt das Wort, das über AR1 adressiert wird und speichert es im nächsten Wort ab.

    Gruß
    Larry

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

    ibanesch (13.01.2011)

  9. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.335
    Danke
    932
    Erhielt 3.333 Danke für 2.691 Beiträge

    Standard

    Zitat Zitat von M-Ott Beitrag anzeigen
    Auf den ersten Blick sieht alles gut aus, allerdings finde ich Deine Schleife etwas eigenwillig programmiert.
    Zitat Zitat von M-Ott Beitrag anzeigen
    @online
    So, wie ibanesch es programmiert hat, ist es zwar sehr ungewöhnlich, müsste aber funktionieren.
    Mein lieber Michael - für eine fundierte Aussage reicht es nicht, nur einen Blick auf den Code zu werfen.
    Man muß schon den Code verstehen und ggf. testen. Dazu braucht man nicht unbedingt einen Simulator,
    das kann man notfalls auch mit Zettel und Stift am Schreibtisch tun.

    Die Antwort an ibanesch mit 'drüber Nachdenken lautet: der Code funktioniert leider NICHT wie gewünscht!

    An dem ungetesteten Programmentwurf ist doch so einiges anzumerken und zu ändern:
    Zitat Zitat von ibanesch Beitrag anzeigen
    Code:
          L     P#0.0
          LAR1  
          AUF   #DB_nummer
          L     0
    M001: T     #S_ZAE
          L     DBW [AR1,P#0.0]
          L     #Can_msg
          ==I   
          SPB   M002
          +AR1  P#2.0
          L     #S_ZAE
          L     DBLG
          ==I   
          BEB   
          L     #S_ZAE
          L     2
          +I    
          LOOP  M001
     
    M002: S     #treffer
          L     DBW [AR1,P#0.0]
          T     #code
    So wie online in #3 schon andeutete, muß die Besonderheit beachtet werden, daß LOOP den Akku1 decrementiert.
    Der Schleifenzähler #S_ZAE wird als Vorwärts-Word-Zähler (+2) benutzt, LOOP decrementiert aber den Schleifenzähler um 1.
    Im Programmentwurf erhöht sich #S_ZAE tatsächlich nur um 1 je Schleifen-Durchlauf.
    Also entweder SPA M001 statt LOOP M001 oder vor dem LOOP S_ZAE + 3 rechnen. (LOOP liest sich aber besser)
    Den Schleifenzähler #S_ZAE könnte man auch ganz weglassen und stattdessen prüfen: AR1 > (DBLG * 8 - Zugriffsbreite)

    Der Vergleich mit DBLG verhindert nicht, daß über die DB-Länge hinaus gelesen wird, weil zuerst auf das nicht mehr vorhandene
    DBW zugegriffen wird und erst danach geprüft wird.
    Außerdem beachtet der Vergleich nicht, daß höchstens auf die Adresse DBLG-2 (DBLG - Zugriffsbreite) zugegriffen werden kann.
    Und Schleifenzähler prüft man sicherheitshalber auf >= max statt auf == max.

    Wenn keine Übereinstimmung mit #Can_msg gefunden wird, dann sind #treffer und #code unbestimmt (keine Zuweisungen).
    Wenn eine Übereinstimmung gefunden wurde, dann wird immer #code = #Can_msg zurückgegeben.
    Das nochmalige L DBW [AR1,P#0.0] nach M002 ist überflüssig.

    Wenn DBLG = 64kB ist und #Can_msg nicht gefunden wird, dann endet die Schleife und geht zu M002, was als #treffer=true gewertet wird!
    (sofern die CPU dann noch nicht wegen Zykluszeitüberschreitung in Stop gegangen ist).
    Wenn DBLG > 64kB ist wird die Schleife nur höchstens DBLG-64k mal durchlaufen.

    Ich habe das Programm mal so geändert, daß der Entwurf noch zu erkennen ist, es aber nun funktionieren sollte (nicht getestet):
    Code:
          L     P#0.0
          LAR1  
          AUF   #DB_nummer
          L     2           // 2 = wg. Word-Zugriffsbreite, max.Adr.: DBLG-2
    M001: T     #S_ZAE
          L     DBLG
          >D
          SPB   M003
    
          L     #Can_msg
          L     DBW [AR1,P#0.0]
          ==I   
          S     #treffer
          SPB   M002
    
          +AR1  P#2.0
          L     #S_ZAE
          L     3           // 3 = 2 (wg. Word!) + 1 (wg. LOOP!)
          +I    
          LOOP  M001
    
    M003: R     #treffer
          L     0           // Ersatzwert bei nicht gefunden
     
    M002: T     #code
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    ibanesch (13.01.2011)

  11. #8
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.628
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    [IRONIE]
    Ich gelobe, nie wieder in diesem Forum Code zu beurteilen, den ich nicht verstanden und in ausführlichen Tests und Prüfungen verifiziert und validiert habe!
    [/IRONIE]
    Gruß
    Michael

  12. #9
    ibanesch ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    16.06.2010
    Beiträge
    18
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Wirklich vielen Dank, das bei Loop wusste ich nicht, aber schon wieder was gelernt.

    Alerdings eine Sache versteh ich noch nicht

    Zitat Zitat von PN/DP Beitrag anzeigen
    Wenn DBLG = 64kB ist und #Can_msg nicht gefunden wird, dann endet die Schleife und geht zu M002, was als #treffer=true gewertet wird!

    Wenn DBLG > 64kB ist wird die Schleife nur höchstens DBLG-64k mal durchlaufen.
    Warum währe das bei einer DB Länge > 64kB so?
    Liegt das an der Funktion von DBLG?
    (Der DB in meinem Programm enthält nur 92 Werte)

  13. #10
    Registriert seit
    30.08.2010
    Ort
    Östereich
    Beiträge
    1.470
    Danke
    506
    Erhielt 218 Danke für 193 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Als Dummer Prog hab ich da noch ne Frage:
    bei Loop wird da wirklich in der Schleige gsprungen und der Zyklus nicht weiter bearbeitet, warum nicht was das im Zyklus Arbeitet und bei jedem Zyklus den nächsten Datensatz abfragt?
    Elektrotechnik und Elektronik funktioniert mit Rauch (Beweis: Tritt Rauch aus, funktioniert auch das Bauteil nicht mehr)

Ähnliche Themen

  1. Antworten: 50
    Letzter Beitrag: 01.08.2011, 12:57
  2. Antworten: 6
    Letzter Beitrag: 12.08.2009, 17:26
  3. Existenz eines DB überprüfen
    Von maxcis im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 26.06.2009, 00:42
  4. Antworten: 7
    Letzter Beitrag: 13.10.2008, 19:56
  5. Antworten: 6
    Letzter Beitrag: 11.10.2004, 01:55

Lesezeichen

Berechtigungen

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