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

Seite 6 von 10 ErsteErste ... 45678 ... LetzteLetzte
Ergebnis 51 bis 60 von 99

Thema: Mit Pointer in Ringregister schreiben

  1. #51
    Registriert seit
    23.07.2013
    Beiträge
    66
    Danke
    26
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Und ich bekomme wieder einen Fehler:

    Ferhlerbild.jpg

  2. #52
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Was steht zu diesem Zeitpunkt in MW12 ?
    Der Fehler sagt aus, dass du an eine Stelle schreiben willst, die es im DB nicht gibt, er also wahrschenlich zu kurz ist.
    Was steht im DB-Register? (Welcher DB ist zu diesem Zeitpunkt aktiv?) Sollte ja "Register" sein, aber noch mal kontrollieren.
    Ist der DB von dir auch ins AG übertragen worden?
    Geändert von Ralle (31.07.2013 um 12:11 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #53
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Argh, dein Loop ist falsch, jetzt seh ich das:


    Code:
    // Zeiger initialisieren
          L     #DS_Anzahl                  // maximale Anzahl an Datensätzen
          +     1                           // für Start um 1 erhöhen           streichen!!!
    
    !!// Schleifenstart = Zeiger dekrementieren
    Next: +     -1                          // um 1 verringern         streichen!!!
          T     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer speichern
    
    // Pointer erstellen
          L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer
          L     #DS_Laenge                  // Datensatzlänge
          *I    
          L     #DS_Offset                  // Startadresse des Datenfeldes
          +I    
          SLD   3                           // berechneten Wert auf die Byteadresse schieben
          LAR1                              // und ins Adressregister 1 schreiben
    
    // Daten eintragen
          L     0                           // Wert 0
          T     DBD [AR1,P#0.0]             // ins 1. DWORD eintragen
    
          L     0                           // Wert 0
          T     DBD [AR1,P#4.0]             // ins 2. DWORD eintragen
    
    // Zeiger auf Null prüfen
          L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer laden
          LOOP  Next                        // Schleife wiederholen, bis Ringpuffer bei Null steht
    Loop verringert die Variable "#Zeiger_Ringpuffer" selbst um 1.
    Dadurch löscht du nur jeden 2. Datensatz und beim letzten löscht du bei einer sehr hohen Adresse, da dein Wert -1 wird, als DWort also mithin eine hohe Adresse ausgerechnet wird, die es wohl nicht gibt.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  4. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    hucki (31.07.2013)

  5. #54
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Argh, dein Loop ist falsch, jetzt seh ich das:

    Loop verringert die Variable "#Zeiger_Ringpuffer" selbst um 1.
    Das ist dann wohl mein Fehler!

    Aber wie bekommt er dann den Datensatz 0 gelöscht? Da erfolgt doch dann kein Rücksprung mehr, oder?


    PS: Ich vermute mal, einen separaten Schleifenindex, oder?
    Geändert von hucki (31.07.2013 um 12:47 Uhr)

  6. #55
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Hab' das jetzt mal korrigiert (hoffentlich) und die Übergabe der aktuellen Uhrzeit auch gleich noch auf (wie vorgegeben) Bytes geändert:

    Code:
    FUNCTION_BLOCK "Ereignisspeicher"
    TITLE =
    AUTHOR  : Hucki
    VERSION : 0.1
    
    
    VAR_INPUT
      Speichern : BOOL ;	
      Reset : BOOL ;	
      Register : BLOCK_DB ;	
      DS_Laenge : INT ;	
      DS_Offset : INT ;	
      DS_Anzahl : INT ;	
      Uhrzeit : STRUCT 	
       Aktuell_Stunden : BYTE ;	
       Aktuell_Minuten : BYTE ;	
       Aktuell_Sekunden : BYTE ;	
      END_STRUCT ;	
    END_VAR
    
    VAR
      Zeiger_Ringpuffer : INT ;	
      Ereigniszaehler : INT ;	
      Schleifenindex : INT ;	
      FM_Speichern : BOOL ;	
      FM_Reset : BOOL ;	
    END_VAR
    
    VAR_TEMP
      Sicherung_AR1 : DWORD ;	
      Error : INT ;	
    END_VAR
    
    
    BEGIN
    
    NETWORK
    TITLE =
    
          U     #Speichern;
          FP    #FM_Speichern;
          SPBN  Neu; 
    
          AUF   #Register;
    
    // Zeiger inkrementieren
          L     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer 
          +     1; 
          T     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
    
    // Zeiger auf Überlauf prüfen
          L     #DS_Anzahl; // maximale Anzahl an Datensätzen
          L     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
          <=I   ; 
          SPBN  over; 
          L     0; 
    over: T     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
    
    
    // Ereigniszähler inkrementiern
          L     #Ereigniszaehler; // Ereigniszähler
          +     1; 
          T     #Ereigniszaehler; // Ereigniszähler
    
    // AR1 sichern                            
          TAR1  ; // AR1 in Akku1 laden
          T     #Sicherung_AR1; // und im Temp sichern (im Forum so gelernt :) )
    
    // Pointer erstellen
          L     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
          L     #DS_Laenge; // Datensatzlänge
          *I    ; 
          L     #DS_Offset; // Startadresse des Datenfeldes
          +I    ; 
          SLD   3; // berechneten Wert auf die Byteadresse schieben
          LAR1  ; // und ins Adressregister 1 schreiben
    
    // Daten eintragen
          L     #Ereigniszaehler; // Ereigniszähler
          T     DBW [AR1,P#0.0]; // und wieder sichern
    
          L     #Uhrzeit.Aktuell_Stunden; // Aktuelle Stunde (könnte man auch getrennt übergeben) laden
          T     DBB [AR1,P#4.0]; // und in Ringpuffer sichern
    
          L     #Uhrzeit.Aktuell_Minuten; // Aktuelle Minute (könnte man auch getrennt übergeben) laden
          T     DBB [AR1,P#5.0]; // und in Ringpuffer sichern
    
          L     #Uhrzeit.Aktuell_Sekunden; // Aktuelle Sekunde (könnte man auch getrennt übergeben) laden
          T     DBB [AR1,P#6.0]; // und in Ringpuffer sichern
    
    // AR1 wiederherstellen                            
          L     #Sicherung_AR1; // Gesicherten Wert laden
          LAR1  ; // und ins AR1 zurückschreiben
    
    
    
    
    // Register ggf. resetten
    Neu:  U     #Reset; // Öffner-Taster
          FN    #FM_Reset; // deswegen negative Flanke
          SPBN  ende; 
    
    // AR1 sichern                            
          TAR1  ; // AR1 in Akku1 laden
          T     #Sicherung_AR1; // und im Temp sichern
    
    // Zeiger initialisieren
          L     #DS_Anzahl; // maximale Anzahl an Datensätzen
          +     1; // für Start um 1 erhöhen
    
    // Schleifenstart = Zeiger dekrementieren
    Next: T     #Schleifenindex; // als Schleifenindex speichern
          +     -1; // um 1 verringern
          T     #Zeiger_Ringpuffer; // als Zeiger für Ringpuffer speichern
    
    // Pointer erstellen
          L     #Zeiger_Ringpuffer; // Zeiger für Ringpuffer
          L     #DS_Laenge; // Datensatzlänge
          *I    ; 
          L     #DS_Offset; // Startadresse des Datenfeldes
          +I    ; 
          SLD   3; // berechneten Wert auf die Byteadresse schieben
          LAR1  ; // und ins Adressregister 1 schreiben
    
    // Daten eintragen
          L     0; // Wert 0
          T     DBD [AR1,P#0.0]; // ins 1. DWORD eintragen
    
          L     0; // Wert 0
          T     DBD [AR1,P#4.0]; // ins 2. DWORD eintragen
    
    // Zeiger auf Null prüfen
          L     #Schleifenindex; // Schleifenzähler laden,
          LOOP  Next; // um 1 verringern und Schleife wiederholen, wenn Schleifenzähler noch > 0
    
    // AR1 wiederherstellen                            
          L     #Sicherung_AR1; // Gesicherten Wert laden
          LAR1  ; // und ins AR1 zurückschreiben
    
    ende: NOP   0; 
    
    END_FUNCTION_BLOCK

    @Minico89,
    sorry, wenn ich bei den Lokalvariablen bleibe, aber das Hantieren mit den Merkern bzw. globalen Daten innerhalb des FBs ist in meinen Augen einfach "unschön" und deshalb will ich niemanden erst dazu motivieren.
    Der Aufruf des FBs würde dann mit der Übergabe der benötigten Sachen (die Du bis jetzt global oder als Konstante im FB angibst) an der Schnittstelle z.B. so aussehen:


  7. Folgende 2 Benutzer sagen Danke zu hucki für den nützlichen Beitrag:

    D4K!ZZ4 (31.07.2013),Minico89 (01.08.2013)

  8. #56
    Registriert seit
    23.07.2013
    Beiträge
    66
    Danke
    26
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    Code:
    [FONT=Courier New]FUNCTION_BLOCK "Ereignisspeicher"
    TITLE =
    AUTHOR  : Hucki
    VERSION : 0.1
    
    
    VAR_INPUT
      Speichern : BOOL ;	
      Reset : BOOL ;	
      Register : BLOCK_DB ;	
      DS_Laenge : INT ;	
      DS_Offset : INT ;	
      DS_Anzahl : INT ;	
      Uhrzeit : STRUCT 	
       Aktuell_Stunden : BYTE ;	
       Aktuell_Minuten : BYTE ;	
       Aktuell_Sekunden : BYTE ;	
      END_STRUCT ;	
    END_VAR
    
    VAR
      Zeiger_Ringpuffer : INT ;	
      Ereigniszaehler : INT ;	
      Schleifenindex : INT ;	
      FM_Speichern : BOOL ;	
      FM_Reset : BOOL ;	
    END_VAR
    
    VAR_TEMP
      Sicherung_AR1 : DWORD ;	
      Error : INT ;	
    END_VAR
    
    
    



    @Minico89,
    sorry, wenn ich bei den Lokalvariablen bleibe, aber das Hantieren mit den Merkern bzw. globalen Daten innerhalb des FBs ist in meinen Augen einfach "unschön" und deshalb will ich niemanden erst dazu motivieren.
    Der Aufruf des FBs würde dann mit der Übergabe der benötigten Sachen (die Du bis jetzt global oder als Konstante im FB angibst) an der Schnittstelle z.B. so aussehen:

    Was mache ich mit dem rot-markierten Code, wo schreibe ich das hin? Und danke hucki, das mit den Lokalvariablen ist gut!

  9. #57
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Du gehst im Simatikmanager auf den Ordner Quellen und fügst Dir dort ein neues Objekt vom Typ AWL-Quelle ein.
    Die öffnest Du dann und kopierst Dir den gesamten Code, den ich gepostet habe, dort hinein.
    Anschließend läßt Du diesen Code über das Menü Datei->Übersetzen na? ... -> Übersetzen, richtig!

    S7 erstellt Dir dann daraus den kompletten FB, vorausgesetzt es findet den FB-Namen "Ereignisspeicher" (oder den von Dir gewünschten) im Symboleditor. Alternativ könnte man in der Quelle auch direkt z.B. FB2 anstelle von "Ereignisspeicher" angeben.


    Ansonsten kannst Du die von Dir rot markierte Deklaration der Lokalvariablen natürlich auch von Hand in die Schnittstelle des FBs eintragen, die Du oberhalb der Netzwerke im Editor findest.

  10. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    Minico89 (01.08.2013)

  11. #58
    Registriert seit
    23.07.2013
    Beiträge
    66
    Danke
    26
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Okay, das mit dem Übersetzen hat nicht geklappt, es wirft mir 29 Fehler und 6 Warnungen aus!

    Ich glaube das Variablen eintippen werde ich bevorzugen, nur was trage ich ein in:

    IN:
    Speichern : BOOL ;
    Reset : BOOL ;
    Register : BLOCK_DB ;
    DS_Laenge : INT ;
    DS_Offset : INT ;
    DS_Anzahl : INT ;
    Uhrzeit : STRUCT
    Aktuell_Stunden : BYTE ;
    Aktuell_Minuten : BYTE ;
    Aktuell_Sekunden : BYTE ;
    END_STRUCT ;

    OUT:

    IN_OUT:

    STAT:
    Zeiger_Ringpuffer : INT ;
    Ereigniszaehler : INT ;
    Schleifenindex : INT ;
    FM_Speichern : BOOL ;
    FM_Reset : BOOL ;

    TEMP:
    Sicherung_AR1 : DWORD ;
    Error : INT ;


    Stehen die Sachen an den richtigen Stellen?????

  12. #59
    Registriert seit
    23.07.2013
    Beiträge
    66
    Danke
    26
    Erhielt 0 Danke für 0 Beiträge

    Standard

    PLANÄNDERUNG

    Okay, ich versuche es auf eine andere Weise mit dem folgenden Code:

    Code:
          U     E    124.1
          FP    M     10.1
          SPBN  ende
    
          L     "Uhrzeit".Aktuell_Stunden
          T     #Temp_akt_h
    
          L     "Uhrzeit".Aktuell_Minuten
          T     #Temp_akt_m
    
          L     "Uhrzeit".Aktuell_Sekunden
          T     #Temp_akt_s
    
    
    
          AUF   "Register"
    
    // Zeiger inkrementieren
          L     MW    12                    // Zeiger für Ringpuffer
          +     1
          T     MW    12                    // Zeiger für Ringpuffer
    
    // Zeiger auf Überlauf prüfen
          L     20                          // maximale Anzahl an Datensätzen
          L     MW    12                    // Zeiger für Ringpuffer
          <=I   
          SPBN  over
          L     0
    over: T     MW    12                    // Zeiger für Ringpuffer
    
    
    // Ereigniszähler inkrementiern
          L     MW    14                    // Ereigniszähler
          +     1
          T     MW    14                    // Ereigniszähler
    
    // Daten eintragen
          L     MW    12                    // Zeiger für Ringpuffer
          L     8                           // Datensatzlänge
          *I    
          +     10                          // Startadresse des Datenfeldes
          SLD   3
          LAR1  
    
          L     MW    14                    // Ereigniszähler
          T     DBW [AR1,P#0.0]             // und wieder sichern
    
          L     #Temp_akt_h                 // Aktuelle Stunde laden
          T     DBB [AR1,P#4.0]             // und in Ringpuffer sichern
    
          L     #Temp_akt_m                 // Aktuelle Minute laden
          T     DBB [AR1,P#5.0]             // und in Ringpuffer sichern
    
          L     #Temp_akt_s                 // Aktuelle Sekunde laden
          T     DBB [AR1,P#6.0]             // und in Ringpuffer sichern
    
    ende: NOP   0

    Dieser Code soll erweitert werden, und zwar folgendermaßen:

    Wenn die FN vom E 124.2 kommt soll eine Schleife Anfangen im Eintrag [0] den Wert Null für alles zu schreiben. Alle 5 ms soll der Zeiger dann weiterspringen im Eintrag [1] , [2] usw... wieder auf Null zurücksetzen.

    Wenn ich das mal so überdenke soll die Schleife also 2000 mal springen alle 5ms , d.h. 10 sek.

    Wie zum Henker setze ich das in einen Code um???

  13. #60
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Minico89 Beitrag anzeigen
    Okay, das mit dem Übersetzen hat nicht geklappt, es wirft mir 29 Fehler und 6 Warnungen aus!
    Die 6 Warnungen sind wegen der indirekten DB-Zugriffe.

    Aber was zeigt er denn bei den 29 Fehlern an?
    Irgendwo ein Semikolon oder so gelöscht oder irgendwas geändert?
    Kannst Du mal ein Screenshot von der Infozeile mit den Fehlern hochladen?


    Anschließend wenden wir uns dann der Planänderung zu.
    Immer schön eins nach dem anderen.

Ähnliche Themen

  1. mit any pointer ein bit schreiben
    Von Limette im Forum Simatic
    Antworten: 24
    Letzter Beitrag: 01.03.2012, 12:40
  2. Array in DB schreiben(any-pointer)
    Von Limette im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 28.10.2011, 22:17
  3. Störmledungsbaustein mit Pointer?!?
    Von CrazyMC im Forum Simatic
    Antworten: 27
    Letzter Beitrag: 20.05.2010, 00:49
  4. Pointer als Out Variable Daten schreiben
    Von mkd im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 28.10.2009, 10:58
  5. Problem mit Pointer
    Von Mathias im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 06.02.2009, 10:03

Lesezeichen

Berechtigungen

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