Step 7 Störbits erkennen

Zuviel Werbung?
-> Hier kostenlos registrieren
Bezüglich des anderen Problems; glaube das dürfte so noch nicht klappen, weil ja durch M10.0 der Ausgang (bei noch anstehenden Meldungen) gleich wieder gesetzt wird ... Daher wird die Meldeanzeige nur solange ausgeblendet, wie die Taste gedrückt wird.

... aber no problem! ;)

hast du es ausprobiert? Nein? ich schon :p
 
hast du es ausprobiert? Nein? ich schon :p

Ähm, jetzt schon! Klappt aber nicht - sobald die Taste OP_ACK losgelassen wird, blendet die Meldeanzeige wieder ein ...

Es würde nur funktionieren, wenn ich eine Flanke zuhilfe nehme:

Code:
      U     M     10.0
     [COLOR=#ff0000] FP    M     30.0[/COLOR]
      S     A      4.7
      U     A      4.7
      UN    M     10.1
      O     
      U     A      4.7
      U     M     "op_ack"
      R     A      4.7


Aber wenn es bei dir auch ohne Flanke klappt, dann haben wir wahrscheinlich unterschiedliche Softwarestände ... :p
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ähm, jetzt schon! Klappt aber nicht - sobald die Taste OP_ACK losgelassen wird, blendet die Meldeanzeige wieder ein ...

Es würde nur funktionieren, wenn ich eine Flanke zuhilfe nehme:

Code:
      U     M     10.0
     [COLOR=#ff0000] FP    M     30.0[/COLOR]
      S     A      4.7
      U     A      4.7
      UN    M     10.1
      O     
      U     A      4.7
      U     M     "op_ack"
      R     A      4.7


Aber wenn es bei dir auch ohne Flanke klappt, dann haben wir wahrscheinlich unterschiedliche Softwarestände ... :p

dann ist dein M10.0 ein anderer als meiner ... ich bekomme auf M10.0 ein NewMessage IMPULS
 

Anhänge

  • 1.jpg
    1.jpg
    70,3 KB · Aufrufe: 10
  • 2.jpg
    2.jpg
    61,9 KB · Aufrufe: 10
  • 3.jpg
    3.jpg
    67,6 KB · Aufrufe: 8
  • 4.jpg
    4.jpg
    65,6 KB · Aufrufe: 9
dann ist dein M10.0 ein anderer als meiner ... ich bekomme auf M10.0 ein NewMessage IMPULS

Naja ist eigentlich ja auch so programmiert, wenn ich es richtig verstehe:

Code:
      FP    DBX [AR1,P#32.0]; 
      S     #newMsg;

Nur, ich habe alles 1:1 abgetippt und versuche jetzt zu verstehen ...

FC.jpg

Einzig die FC20 habe ich direkt im OB1 aufgerufen; aber das kann ja keinen Unterschied machen.


Da bin ich doch mal wieder ratlos!
 
Einzig die FC20 habe ich direkt im OB1 aufgerufen; aber das kann ja keinen Unterschied machen.

wenn der FC20 der einzige Baustein in der Bearbeitung ist, dann ist genau das ein Unterschied.
füge in den FC20 hinter TAR2 ein CLR; = #newMsg; ein

Erklärung dazu hier: http://www.sps-forum.de/simatic/32113-temporaere-lokalvariablen.html
Angesprochen habe ich diese kleine Änderung bereits hier: http://www.sps-forum.de/simatic/71817-stoerbits-erkennen-4.html#post499057
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mache 2 Schleifen nacheinander. Die erste Schleife sucht neue 1-Bits und die zweite Schleife sucht irgendein 1-Bit. Die zweite Schleife kann abgebrochen werden, sobald irgendein 1-Bit festgestellt wurde.
Folgende 2-Schleifen-Variante entspricht der Arbeitsweise des linearen Programms von #21
Code:
      SET   
      R     #newMsg                     //( OUT: newMsg : BOOL )
      R     #Message                    //( OUT: Message : BOOL )

      AUF   #inDB                       //( IN: inDB : BLOCK_DB )

//*** Schleife ************
      LAR1  P#0.0                       //Pointer auf Anfang ACT-Array
      L     8                           //Anzahl DWORDs im ACT-Array
nxt2: T     #Lcount                     //Schleifenzähler

//*** Neu-Bit(s) vorhanden?
      L     DBD [AR1,P#32.0]            //FLAG-Bits (Zustand vorher)
      INVD  
      L     DBD [AR1,P#0.0]             //ACT-Bits (Zustand jetzt)
      T     DBD [AR1,P#32.0]            //FLAG-Bits (Zustand vorher)
      UD    
      U     <>0                         //mindestens 1 ACT-Bit neu dazugekommen
      S     #newMsg

//*** Pointer auf nächstes DWORD und Schleife wiederholen
      +AR1  P#4.0                       //Größe=Abstand DWORD
      L     #Lcount
      LOOP  nxt2

//*** zweite Schleife *****
      LAR1  P#0.0                       //Pointer auf Anfang ACT-Array
      L     8                           //Anzahl DWORDs im ACT-Array
nxt0: T     #Lcount                     //Schleifenzähler

//*** TRUE-Bit(s) vorhanden?
      L     DBD [AR1,P#0.0]             //ACT-Bits (Zustand jetzt)
      PUSH  
      OD    
      U     <>0
      S     #Message
      SPBN  end2

//*** Pointer auf nächstes DWORD und Schleife wiederholen
      +AR1  P#4.0                       //Größe=Abstand DWORD
      L     #Lcount
      LOOP  nxt0

//*** Ende, ENO setzen
end2: SET   
      SAVE

Zu nur einer Schleife zusammengefasst
Code:
      SET   
      R     #newMsg                     //( OUT: newMsg : BOOL )
      R     #Message                    //( OUT: Message : BOOL )

      AUF   #inDB                       //( IN: inDB : BLOCK_DB )

//*** Schleife ************
      LAR1  P#0.0                       //Pointer auf Anfang ACT-Array
      L     8                           //Anzahl DWORDs im ACT-Array
nxt1: T     #Lcount                     //Schleifenzähler

//*** Neu-Bit(s) vorhanden?
      L     DBD [AR1,P#32.0]            //FLAG-Bits (Zustand vorher)
      INVD  
      L     DBD [AR1,P#0.0]             //ACT-Bits (Zustand jetzt)
      T     DBD [AR1,P#32.0]            //FLAG-Bits (Zustand vorher)
      UD    
      U     <>0                         //mindestens 1 ACT-Bit neu dazugekommen
      S     #newMsg

//*** TRUE-Bit(s) vorhanden?
      L     DBD [AR1,P#0.0]             //ACT-Bits (Zustand jetzt)
      PUSH  
      OD    
      U     <>0
      S     #Message

//*** Pointer auf nächstes DWORD und Schleife wiederholen
      +AR1  P#4.0                       //Größe=Abstand DWORD
      L     #Lcount
      LOOP  nxt1

//*** Ende, ENO setzen
      SET   
      SAVE

Die Variante von vierlagig aus #31, so wie ich sie schreiben würde
Code:
      SET   
      R     #newMsg                     //( OUT: newMsg : BOOL )
      L     0
      T     #ACT_ON                     //( TEMP : ACT_ON : INT )

      AUF   #inDB                       //( IN: inDB : BLOCK_DB )

//*** Schleife initialisieren
      LAR1  P#0.0                       //Pointer auf Anfang ACT-Array
      L     256                         //Anzahl Bits im ACT-Array
next: T     #Lcount                     //Schleifenzähler

//*** Neu-Bit?
      U     DBX [AR1,P#0.0]             //ACT-Bit
      FP    DBX [AR1,P#32.0]            //FLAG-Bit
      S     #newMsg

//*** Anzahl TRUE-Bits zählen
      U     DBX [AR1,P#0.0]             //ACT-Bit
      SPBN  not
      L     #ACT_ON
      +     1
      T     #ACT_ON

//*** Pointer auf nächstes Bit und Schleife wiederholen
not:  +AR1  P#0.1                       //Größe=Abstand Bit
      L     #Lcount
      LOOP  next

//*** Anzahl TRUE-Bits > 0 ?
      LAR1  P#64.0                      //Pointer auf #inDB.ACT_ON
      L     #ACT_ON
      T     DBW [AR1,P#0.0]
      L     0
      <>I   
      =     #Message                    //( OUT: Message : BOOL )

//*** Ende, ENO setzen
      SET   
      SAVE

Alle 3 Varianten gehen von einem DB mit diesem Aufbau von vierlagig aus:
Code:
DATA_BLOCK DB 20
TITLE =
VERSION : 0.1
  STRUCT  
   ACT : ARRAY  [0 .. 7 ] OF DWORD ; 
   FLAG : ARRAY  [0 .. 7 ] OF DWORD ; 
   ACT_ON : INT ; 
  END_STRUCT ; 
BEGIN
   
END_DATA_BLOCK

PS: obenstehende Codes sind nicht getestet.

Harald
 
Zuletzt bearbeitet:
Und die korrigierte Variante von spirit aus #13 (nicht getestet)
Es hatte nicht mehr viel gefehlt...
Code:
      SET   
      R     #neue_Message               // ( TEMP: neue_Message : BOOL )
      S     #keine_Message              // ( TEMP: keine_Message : BOOL )

      AUF   "DB10"

      L     P#16.0
      T     #pointer_1                  //Anfangsadresse Meldungs-Bits

      L     P#36.0
      T     #pointer_2                  //Anfangsadresse vorher-Bits

      L     4                           //4 DWORDs
Next: T     #zaehler

//*** irgendein Bit ist neu auf 1?
      L     DBD [#pointer_2]            //vorher-Bits
      INVD  
      L     DBD [#pointer_1]            //Meldungs-Bits
      T     DBD [#pointer_2]            //vorher-Bits
      UD    
      U     <>0                         //irgendein Bit ist neu auf 1?
      S     #neue_Message

//*** irgendein Bit ist 1?
      L     DBD [#pointer_1]            //Meldungs-Bits
      L     0
      <>D                               //irgendein Bit ist 1?
      R     #keine_Message

//*** Schleife wiederholen für nächstes DWORD
      L     #pointer_1
      L     P#4.0
      +D    
      T     #pointer_1

      L     #pointer_2
      L     P#4.0
      +D    
      T     #pointer_2

      L     #zaehler
      LOOP  Next

//*** Anzeige Ein-/Ausblenden
      U     #neue_Message
      S     A      4.7
      O     #keine_Message
      O     "OP_ACK"   
      R     A      4.7

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und die korrigierte Variante von spirit aus #13 (nicht getestet)
Es hatte nicht mehr viel gefehlt...
Code:
      SET   
      R     #neue_Message               // ( TEMP: neue_Message : BOOL )
      S     #keine_Message              // ( TEMP: keine_Message : BOOL )

      AUF   "DB10"

      L     P#16.0
      T     #pointer_1                  //Anfangsadresse Meldungs-Bits

      L     P#36.0
      T     #pointer_2                  //Anfangsadresse vorher-Bits

      L     4                           //4 DWORDs
Next: T     #zaehler

//*** irgendein Bit ist neu auf 1?
      L     DBD [#pointer_2]            //vorher-Bits
      INVD  
      L     DBD [#pointer_1]            //Meldungs-Bits
      T     DBD [#pointer_2]            //vorher-Bits
      UD    
      U     <>0                         //irgendein Bit ist neu auf 1?
      S     #neue_Message

//*** irgendein Bit ist 1?
      L     DBD [#pointer_1]            //Meldungs-Bits
      L     0
      <>D                               //irgendein Bit ist 1?
      R     #keine_Message

//*** Schleife wiederholen für nächstes DWORD
      L     #pointer_1
      L     P#4.0
      +D    
      T     #pointer_1

      L     #pointer_2
      L     P#4.0
      +D    
      T     #pointer_2

      L     #zaehler
      LOOP  Next

//*** Anzeige Ein-/Ausblenden
      U     #neue_Message
      S     A      4.7
      O     #keine_Message
      O     "OP_ACK"   
      R     A      4.7

Harald

... jetzt schon getestet; klappt alles wunderbar!!! :s12:
 
Zurück
Oben