Störmledungsbaustein mit Pointer?!?

CrazyMC

Level-2
Beiträge
54
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe vor mir einen universellen Baustein für Störmeldungen zu schreiben was bis jetzt auch ganz gut klappt nun stehe ich jedoch vor dem Problem mit der Quittierung...

Habe zb die Störung im db190.dbx24.0 nun muss ich ja beim Quittieren die Meldung rücksetzen und das Quittierbit(db190.dbx36.0) setzen das diese wieder aus dem Panel verschwindet. Da das Meldebit jedoch variabel ist sollte sich die Steuerung also selbstständig das dazu passende Quittierbit suchen was in jedem Falle um den Betrag x entfernt liegt(hier eben 12byte).

Versuche mich nun schon seit Tagen an diesem Problem und seh den Wald vor lauter Bäumen nicht mehr... Hoffe ihr könnt mir helfen
 
Dann machst du einen zweiten pointer mit dem versatz 12 Byte.
Vorrausgesetzt es sind immer 12Byte
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann machst du einen zweiten pointer mit dem versatz 12 Byte.
Vorrausgesetzt es sind immer 12Byte

ja es sind immer 12byte - bei andern sachen könnte ich den baustein ja zur not wieder anpassen
wäre es möglich mal ein kurzes bsp zu tippen denn mittlerweile bin ich schon total neben der spur :confused:
 
vielleicht so ähnlich
Code:
//Pointer des Störbits ins Adressregister
      L     P##Stoerbit
      LAR1  

//Störung setzen
      U     #Stoerungs_ursache
      S     #Stoerbit

//Störung zurücksetzen
      UN    #Stoerungs_ursache
      U      [AR1,P#12.0]
      R     #Stoerbit
      R      [AR1,P#12.0]
 
Wenn du doch einen Pointer benutzt dann musst du doch auch den
Versatz wissen.

der versatz vom störbit bis zum quittierbit sind immer 12byte jedoch sind es gesamt 96 störbits. jetzt müsste ich doch zuerst abhängig vom gesetzen störbit das quittierbit "ausrechnen" über die jetzige funktion wie finde ich aber nun den anfangsbereich des pointers heraus (der variable #meldung) :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
habe jetzt folgendes probiert, jedoch wird mir das quittierbit nicht mehr gesetzt im db

Code:
      L     P##MELDUNG
      LAR1  
      U     #QUITTIERUNG
      R     #MELDUNG
      S      [AR1,P#12.0]
      UN    #MELDUNG
      R      [AR1,P#12.0]
 
habe jetzt folgendes probiert, jedoch wird mir das quittierbit nicht mehr gesetzt im db

Code:
      L     P##MELDUNG
      LAR1  
      U     #QUITTIERUNG
      R     #MELDUNG
      S      [AR1,P#12.0]
      UN    #MELDUNG
      R      [AR1,P#12.0]

ach da hab ich dich eben mißverstanden ich dachte du Quittierst mit
dem OP, so wie du es da gemacht hast funktioniert es nicht, da du
dein Quittierbit Setzt und gleich wieder zurücksetzt.


Code:
//Pointer der Stoerung ins Adressregister
      L     P##MELDUNG
      LAR1  
//Quittierbit setzen
      U     #QUITTIERUNG
      S      [AR1,P#12.0]
//Störung zurücksetzen  
      U      [AR1,P#12.0]
      UN    #Meldung
      R      [AR1,P#12.0]
 
ach da hab ich dich eben mißverstanden ich dachte du Quittierst mit
dem OP, so wie du es da gemacht hast funktioniert es nicht, da du
dein Quittierbit Setzt und gleich wieder zurücksetzt.


Code:
//Pointer der Stoerung ins Adressregister
      L     P##MELDUNG
      LAR1  
//Quittierbit setzen
      U     #QUITTIERUNG
      S      [AR1,P#12.0]
//Störung zurücksetzen  
      U      [AR1,P#12.0]
      UN    #Meldung
      R      [AR1,P#12.0]


das verstehe ich schon nur selbst wenn ich den folgenden Code verwende wird auch kein bit gesetzt...

Code:
      L     P##MELDUNG
      LAR1  

     U     #QUITTIERUNG
     S      [AR1,P#12.0]

der ganze quelltext befindet sich in einem fb und die varibale #meldung ist vom typ bool und liegt in der schnittstelle unter in_out
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist dein FB eine Multiinstanz, dann mußt du die Adressregister retten
und einen Offset vom AR2 berücksichtigen.
Hast du dir mal den Baustein Online angeschaut, da kannst du dir
den Inhalt der Adressregister anzeigen lassen und die aktiven
Datenbausteine, so kannst du sehen welche Adresse angesprochen
wird.
 
ja es ist ein multiinstanzfähiger fb... ohh man hätte ich bloß nicht damit angefangen - wie funktioniert denn das jetzt wieder mit dem retten usw??
 
Hallo,

hier der vollständigkeit halber eine Lösung als FC, die die Störmeldungen in einer Schleife "einliest" und das entsprechende Quittierbit schreibt. Die Funktion errechnet den Offset zwischen Störbit und Quittierbit selbstständig.

Vielleicht hilft dir das als Ansatz

Code:
FUNCTION "Auto_Quitt_Stoer" : VOID
TITLE =
//Autor: D.M.
//Datum: Oktober 2010
//Firma: 
AUTHOR : MkD
VERSION : 0.1


VAR_INPUT
  AutoQuitt : BOOL ;    //Automatische Quittierung Einschalten
  BYTES : INT ;    //Bytelänge der Störmeldungen
END_VAR
VAR_IN_OUT
  IN : POINTER ;    //Startadresse Störmeldungen
END_VAR
VAR_TEMP
  i : INT ;    
  AR1_temp : DWORD ;    
  AR2_temp : DWORD ;    
  temp_bereichszeiger : DWORD ;    
  temp_offset : INT ;    
  temp_DB_NR : INT ;    
END_VAR
BEGIN
NETWORK
TITLE =Register sichern

      TAR1  #AR1_temp; 
      TAR2  #AR2_temp; 
NETWORK
TITLE =Startadresse auf DB kontrollieren

//----Erst einmal Pointer auf Datenbaustein kontrollieren
      L     P##IN; // Andresse des Eingangs- Bits, aus Pointer lesen
      LAR1  ; // Adresspointer adressieren
      L     W [AR1,P#0.0]; // erstes Wort eines Pointers enthält DB-Nr.
      T     #temp_DB_NR; 
      L     0; // Wenn DB-Nr = 0, dann kein D sondern E/A/M
      ==I   ; 
      SPB   noDB; 

      AUF   DB [#temp_DB_NR]; // Wenn DB-Nr <>0, dann DB öffnen

noDB: NOP   0; 
NETWORK
TITLE =Startadresse als Pointer

      L     P##IN; // Startadresse (ANY)
      LAR1  ; 

      L     D [AR1,P#2.0]; // BYTE/BIT Adresse
      T     #temp_bereichszeiger; 
NETWORK
TITLE =Offset zu Quittierbits bestimmen

      L     #BYTES; 
      L     8; 
      *I    ; 
      T     #temp_offset; 
NETWORK
TITLE =Laden der Adressregister

//----Störmeldebereich
      L     #temp_bereichszeiger; 
      LAR1  ; 

//----Quittierbereich = Störmeldebereich + Offset
      L     #temp_bereichszeiger; 
      LAR2  ; 
      L     #temp_offset; 
      +AR2  ; 
NETWORK
TITLE =Automatische Quittierung angewählt?

      U     #AutoQuitt; 
      SPBN  m001; 
NETWORK
TITLE =Automatische Quittierung angewählt

//----Schleifenlänge
      L     #BYTES; 
      L     8; 
      *I    ; 
//----Schleife--------------
next: T     #i; 

//Störung
      U     DBX [AR1,P#0.0]; 
      R     DBX [AR2,P#0.0]; 
//keine Störung
      UN    DBX [AR1,P#0.0]; 
      S     DBX [AR2,P#0.0]; 

//----Inkrementieren der Adressregister um 1 Bit
      L     P#0.1; 
      +AR1  ; 
      L     P#0.1; 
      +AR2  ; 

      L     #i; 
      LOOP  next; 
//---------------------------
      SPB   end; 
NETWORK
TITLE =Automatische Quittierung abgewählt

m001: NOP   0; 

//----Schleifenlänge
      L     #BYTES; 
      L     8; 
      *I    ; 
//----Schleife--------------
nxt:  T     #i; 

//Alle Quittierbits Reset
      SET   ; 
      R     DBX [AR2,P#0.0]; 

//----Inkrementieren der Adressregister um 1 Bit
      L     P#0.1; 
      +AR2  ; 

      L     #i; 
      LOOP  nxt; 
//---------------------------
NETWORK
TITLE =Adressregister wiederherstellen

end:  LAR1  #AR1_temp; 
      LAR2  #AR2_temp; 
END_FUNCTION
Da ich selbst noch nicht oft mit dem AR2 in Multiinstanzfähigen FB´s herum gemacht habe, kann ich dir nicht aus dem FF helfen.

Pronzipiell sicherst du aber am Anfang deines FB´s den Inhalt des Adressregisters
Code:
 TAR2  #AR2_temp
am Ende deines Bausteins schreibst du den gesicherten Inhalt zurück

Code:
LAR2  #AR2_temp;
Zum Offset solltest du mal die Forensuche nutzen. Hier wurde viel darüber geschrieben.



Gruß
Daniel
 
Wenn du weiterhin ein Multiinstanzbaustein nutzen möchtest, hier ein
Beispiel wie du den Offset in der Instanz ausrechnen kannst:
Code:
//Adressregister retten 
      TAR1  #dTempAR1
      TAR2  #dTempAR2

//Adresse laden
      TAR2                              //AR2 in Akku
      UD    DW#16#FFFFFF                //Bereichscodierung ausblenden
      L     P##Meldung                  //Stardadresse "Meldung"
      +D    
      LAR1  
...
...
deine Anweisungen, wie auch immer
...
...

//Adressregister wieder herstellen
      LAR1  #dTempAR1
      LAR2  #dTempAR2
 
Wenn du weiterhin ein Multiinstanzbaustein nutzen möchtest, hier ein
Beispiel wie du den Offset in der Instanz ausrechnen kannst:
Code:
//Adressregister retten 
      TAR1  #dTempAR1
      TAR2  #dTempAR2
 
//Adresse laden
      TAR2                              //AR2 in Akku
      UD    DW#16#FFFFFF                //Bereichscodierung ausblenden
      L     P##Meldung                  //Stardadresse "Meldung"
      +D    
      LAR1  
...
...
deine Anweisungen, wie auch immer
...
...
 
//Adressregister wieder herstellen
      LAR1  #dTempAR1
      LAR2  #dTempAR2

mein problem ist wohl das an dem meldungsbit wiedrum ein db steht auf welchen sich die berechnung des quittierbits bezieht - mal schauen ob ich das irgendwie heraus gefiltert bekomme
 
Zurück
Oben