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

Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 34

Thema: Vergleich Merkerdoppelwort auf ungleich Null

  1. #21
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von JesperMP Beitrag anzeigen
    Einfach den Code 4-mal eintippen, und fertig.

    Wenn du willst, kannst du dich üben eine Schleife zu programmieren.
    Es lohnt sich wenn du irgendwann in den Zukunft nicht 2, 4 oder 8 Bytes behandeln muss, sondern 1000.
    #ALARMMEM muss dann aber 4x unterschiedlich sein, richtig?

    Hm ja - ich versuche (nachdem es auf die andere Weise klappt) das mal mit einer Schleife zu lösen... bin ja neugierig!
    LG
    spirit

  2. #22
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.622
    Danke
    377
    Erhielt 799 Danke für 642 Beiträge

    Standard

    Die Variabeln müssen alle 4-mal angelegt werden, ausser "AlarmNew".
    Jesper M. Pedersen

  3. #23
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.173
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    Da es also tatsächlich um die Signalisierung von Neustörung bei mehr als 32 Bit geht: schau dir mal diese Diskussion mit Beispielcode an.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #24
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Da es also tatsächlich um die Signalisierung von Neustörung bei mehr als 32 Bit geht: schau dir mal diese Diskussion mit Beispielcode an.

    Harald
    Naja, es geht um Meldungen (wichtig für Bedienpersonal), wobei aber die Maschine weiterarbeiten kann. Es sind sozusagen keine Störungen und werden in einer Meldeanzeige dargestellt. Soweit funktioniert das jetzt auch mit der 4x-Abfrage prima!

    Etwas eleganter wäre es nun noch (wie von JesperMP vorgeschlagen) das Ganze in eine Schleife zu packen. Wäre dann vermutlich auch weniger Code...

    Mal sehen ob mir das gelingt... habe da so meine Zweifel!
    LG
    spirit

  5. #25
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Hallo Ihr,

    ich glaube ich brauche euch doch nochmal... habe mich gestern noch etwas mit Loop-Schleifen in AWL beschäftigt. Bin jetzt zumindest soweit, dass ich eine einfache Schleife hinbekomme, die z.B. in einem MW eine Subtraktion durchführt.

    Aber für mein eigentliches Problem finde ich keinen Ansatz.

    Ich habe jetzt folgenden Code bei mir programmiert:

    Code:
          L     MD70
          INVD  
          L     DB30.DBD16
          UD    
          L     L#0
          <>D   
          S     A2.0
          L     DB30.DBD16
          T    MD70
    
          L     MD74
          INVD  
          L     DB30.DBD20
          UD    
          L     L#0
          <>D   
          S     A2.0
          L     DB30.DBD20
          T     MD74
    Das Ganze zwar 4x, ist aber erst mal unerheblich.

    Nun kam ja von JesperMP der Vorschlag, man könnte das auch in eine Schleife packen. Lohnt wohl bei dem kurzen Code nicht wirklich, es geht mehr um das WIE?

    Ich überblicke gar nicht, was ich da z.B. Laden muss - in einer Loop-Schleife wird ja am Ende immer um Eins erniedrigt und solange gesprungen, wie der Inhalt vom Akku <>0 ist.

    Lieben Dank!


    Nachtrag... Bin grad an so ner Pointer-Sache mit Schleife dran und möchte gerne das Datendoppelwort laden:

    Code:
    L DBD [#pointer1]
    Bekomme aber die Meldung: Keine indirekten Operationen erlaubt für FC-Parameter pointer1

    Sollte aber doch eigentlich klappen, oder?
    Geändert von spirit (16.05.2014 um 09:21 Uhr)
    LG
    spirit

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

    Standard

    Kommt auf den Datenyp an. IN von einem FC gehen nicht, musst Du vorher in ein TEMP kopieren.
    Gruß
    Michael

  7. #27
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.173
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard

    Zitat Zitat von spirit Beitrag anzeigen
    Aber für mein eigentliches Problem finde ich keinen Ansatz.

    Ich habe jetzt folgenden Code bei mir programmiert:
    Funktioniert Dein Code nicht wie gewünscht?

    Ich glaube nicht, daß man folgende kurze Codesequenz durch eine Schleife mit indirekter Adressierung irgendwie kürzer fassen könnte:
    Code:
          L     MD    70
          INVD  
          L     DB30.DBD   16
          T     MD    70
          UD    
          U     <>0
          S     A      2.0
    
          L     MD    74
          INVD  
          L     DB30.DBD   20
          T     MD    74
          UD    
          U     <>0
          S     A      2.0
    
          L     MD    78
          INVD  
          L     DB30.DBD   24
          T     MD    78
          UD    
          U     <>0
          S     A      2.0
    
          L     MD    82
          INVD  
          L     DB30.DBD   28
          T     MD    82
          UD    
          U     <>0
          S     A      2.0

    Zitat Zitat von spirit Beitrag anzeigen
    Nachtrag... Bin grad an so ner Pointer-Sache mit Schleife dran und möchte gerne das Datendoppelwort laden:

    Code:
    L DBD [#pointer1]
    Bekomme aber die Meldung: Keine indirekten Operationen erlaubt für FC-Parameter pointer1
    #pointer1 muß in FC ein DINT oder DWORD in TEMP oder MD... oder DB... sein - also eigentlich ist nur TEMP sinnvoll. #pointer1 muß vor Verwendung zur speicherindirekten Adressierung von FC-IN nach TEMP kopiert werden.

    Was soll Deinem FC denn übergeben werden? Du bräuchtest ja 2 Pointer auf 2 (Bit-)Felder (oder 1 Pointer, wenn die Adressen von Jetzt-Feld und Vorher-Feld in einem günstigen/berechenbaren Zusammenhang stehen) und eine Bereichs-Längenangabe (oder halt feste Anzahl für soundsoviele Byte).
    Allerdings: alleine die Pointererstellung und -incrementierung ist schon viel aufwendiger als obiger direkter Code. Außerdem verlierst Du dadurch die Referenzdaten auf die bearbeiteten Speicheradressen.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #28
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Funktioniert Dein Code nicht wie gewünscht?

    Ich glaube nicht, daß man folgende kurze Codesequenz durch eine Schleife mit indirekter Adressierung irgendwie kürzer fassen könnte.
    Danke Harald,

    doch mein Code funktioniert prima!

    Wobei ja aber auch noch 4x die Abfrage hinzukommt, ob die DBD's = 0 sind und der Ausgang rückgesetzt werden kann. Ist ja auch noch a bisserl Code.

    Das Schleifen-Konstrukt soll "nur" eine Übung sein...


    Zitat Zitat von PN/DP Beitrag anzeigen

    #pointer1 muß in FC ein DINT oder DWORD in TEMP oder MD... oder DB... sein - also eigentlich ist nur TEMP sinnvoll. #pointer1 muß vor Verwendung zur speicherindirekten Adressierung von FC-IN nach TEMP kopiert werden.

    Harald
    Habe nun anstatt

    Code:
    L DBD [#pointer1]
    einfach

    Code:
    L DBD [MD20]
    programmiert. Nun klappt mein Konstrukt sogar; toll oder?


    Nachfrage: Angenommen ist würde das mit #pointer1 und TEMP machen; kann ich dann nicht direkt

    Code:
    L DBD [#pointer1]  // pointer_1 ist eine TEMP-Var!
    programmieren?
    LG
    spirit

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

    Standard

    Das lässt sich so schlecht beurteilen. Da müsstest Du mal Deinen gesamten Code posten.
    Gruß
    Michael

  10. #30
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.173
    Danke
    922
    Erhielt 3.288 Danke für 2.657 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von spirit Beitrag anzeigen
    Wobei ja aber auch noch 4x die Abfrage hinzukommt, ob die DBD's = 0 sind und der Ausgang rückgesetzt werden kann. Ist ja auch noch a bisserl Code.
    Welchen Sinn soll die Abfrage der DBD auf 0 haben?
    Entweder Du setzt den Ausgang zurück, weil die Meldung(en) gesehen und quittiert wurde, unabhängig davon ob die Meldung noch ansteht.
    Oder Du kannst Dir den ganzen Flankenerkennungs-Aufwand sparen und aktivierst den Ausgang dann wenn irgendein Bit in den Meldungs-Doppelworten 1 ist, z.B. per ODER (OD) über alle Melde-Doppelwörter.

    Ausgang Ein wenn irgendein Meldungsbit 1 ist:
    Code:
          L     DB30.DBD   16
          L     DB30.DBD   20
          OD    
          L     DB30.DBD   24
          OD    
          L     DB30.DBD   28
          OD    
          U     <>0
          =     A      2.0
    Das "bisserl Code" zum Rücksetzen wenn alle DBD 0 sind:
    Code:
          L     DB30.DBD   16
          L     DB30.DBD   20
          OD    
          L     DB30.DBD   24
          OD    
          L     DB30.DBD   28
          OD    
          U     ==0
          U     "gesehen"
          R     A      2.0
    Eventuell macht es Sinn, wenn Du uns die gewünschte Funktion für den Ausgang komplett beschreibst, dann können wir nach der passenden Lösung suchen.


    Zitat Zitat von spirit Beitrag anzeigen
    Nachfrage: Angenommen ist würde das mit #pointer1 und TEMP machen; kann ich dann nicht direkt

    Code:
    L DBD [#pointer1]  // pointer_1 ist eine TEMP-Var!
    programmieren?
    Ja. Doch. Die Anweisung kannst Du genau so schreiben (vorher AUF DB nicht vergessen).
    Kommt natürlich noch darauf an, was in #pointer1 drinsteht. Wenn Du DBD16 laden willst, dann muß in #pointer1 drinstehen: 16 * 8 = 128 dez = P#16.0 = DW#16#xx000080 (die obersten 8 bit xx sind egal / werden ignoriert)

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Step 7 Db´s nach Datentransfer auf null setzen (schreiben).
    Von Martin L. im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 09.09.2013, 10:50
  2. Antworten: 11
    Letzter Beitrag: 14.01.2013, 17:47
  3. Merkerdoppelwort auf bestimmten Wert setzen
    Von 00schneider im Forum Programmierstrategien
    Antworten: 7
    Letzter Beitrag: 15.01.2010, 08:57
  4. Variablen nach Neustart CPU auf null
    Von tomyy im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 14.08.2009, 14:09
  5. String auf Null setzen
    Von ice6461 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 10.08.2007, 18:43

Lesezeichen

Berechtigungen

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