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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: Störmledungsbaustein mit Pointer?!?

  1. #11
    Registriert seit
    11.04.2010
    Beiträge
    39
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Helmut_von_der_Reparatur Beitrag anzeigen
    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

  2. #12
    Registriert seit
    13.10.2007
    Beiträge
    12.032
    Danke
    2.787
    Erhielt 3.269 Danke für 2.157 Beiträge

    Standard

    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.
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  3. #13
    Registriert seit
    11.04.2010
    Beiträge
    39
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Standard

    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??

  4. #14
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    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

  5. #15
    Registriert seit
    28.09.2005
    Beiträge
    428
    Danke
    118
    Erhielt 91 Danke für 76 Beiträge

    Standard

    Code:
    //Autor: D.M.
    //Datum: Oktober 2010
    //Firma: 
    AUTHOR : MkD
    VERSION : 0.1
    Hallo, in welcher Zeitzone lebst du den?

  6. #16
    Registriert seit
    19.12.2006
    Beiträge
    185
    Danke
    25
    Erhielt 26 Danke für 21 Beiträge

    Standard

    Zitat Zitat von mst Beitrag anzeigen
    Code:
    //Autor: D.M.
    //Datum: Oktober 2010
    //Firma: 
    AUTHOR : MkD
    VERSION : 0.1
    Hallo, in welcher Zeitzone lebst du den?


    schnell zurück in die Zukunft...

  7. #17
    Registriert seit
    13.10.2007
    Beiträge
    12.032
    Danke
    2.787
    Erhielt 3.269 Danke für 2.157 Beiträge

    Standard

    das ist bestimmt das verfallsdatum vom Baustein
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  8. #18
    Registriert seit
    11.04.2010
    Beiträge
    39
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Standard

    ich werds wohl aufgeben... die stunden vergehen und ich komme keinen schritt voran

  9. #19
    Registriert seit
    13.10.2007
    Beiträge
    12.032
    Danke
    2.787
    Erhielt 3.269 Danke für 2.157 Beiträge

    Standard

    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
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  10. #20
    Registriert seit
    11.04.2010
    Beiträge
    39
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Helmut_von_der_Reparatur Beitrag anzeigen
    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

Ähnliche Themen

  1. Pointer und Co
    Von mkd im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 31.07.2008, 14:30
  2. SCL: Pointer
    Von dinner4one im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 06.07.2008, 18:07
  3. Pointer in SCL ?
    Von AndreK im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 27.04.2008, 21:24
  4. DB und Pointer
    Von PhilippL im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 12.09.2007, 07:02
  5. VKE und Pointer im FC...
    Von halorenzen im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.07.2004, 13:16

Lesezeichen

Berechtigungen

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