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

Seite 5 von 10 ErsteErste ... 34567 ... LetzteLetzte
Ergebnis 41 bis 50 von 99

Thema: Mit Pointer in Ringregister schreiben

  1. #41
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Du hast doch gerade was mit Pointern üben wollen (immer noch ungetestet):

    [EDIT] Hinweise zu Fehler bei der LOOP-Schleife von Ralle ab Post #53 beachten! [/EDIT]

    Code:
          U     #Speichern                  // IN: BOOL
          FP    #FM_Speichern               // STATIC: BOOL
          SPBN  Neu
    
          AUF   #Register                   // IN: BLOCK_DB
    
    // Zeiger inkrementieren
          L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer (STATIC: INT)
          +     1
          T     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer
    
    // Zeiger auf Überlauf prüfen
          L     #DS_Anzahl                  // maximale Anzahl an Datensätzen  (IN: INT,  Wert 10 über die Schnittstelle übergeben)
          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  (STATIC: INT)
          +     1
          T     #Ereigniszaehler            // Ereigniszähler
    
    // AR1 sichern                            
          TAR1                              // AR1 in Akku1 laden
          T     #Sicherung_AR1              // und im Temp sichern (im Forum so gelernt :), TEMP: DWORD )
    
    // Pointer erstellen
          L     #Zeiger_Ringpuffer          // Zeiger für Ringpuffer
          L     #DS_Laenge                  // Datensatzlänge (IN: INT,  Wert 8 über die Schnittstelle übergeben)
          *I    
          L     #DS_Offset                  // Startadresse des Datenfeldes (IN: INT,  Wert 10 über die Schnittstelle übergeben)
          +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 (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
          T     DBB [AR1,P#4.0]             // und in Ringpuffer sichern
    
          L     #Uhrzeit.Aktuell_Minuten    // Aktuelle Minute (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
          T     DBB [AR1,P#5.0]             // und in Ringpuffer sichern
    
          L     #Uhrzeit.Aktuell_Sekunden   // Aktuelle Sekunde (IN: STRUCT.INT, 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: +     -1                          // um 1 verringern
          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
    
    // AR1 wiederherstellen                            
          L     #Sicherung_AR1              // Gesicherten Wert laden
          LAR1                              // und ins AR1 zurückschreiben
    
    ende: NOP   0
    
    Geändert von hucki (31.07.2013 um 12:46 Uhr) Grund: Fehler bei der LOOP-Schleife!

  2. #42
    Registriert seit
    19.07.2010
    Beiträge
    1.288
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Ich hab grad kein S7 zur Hand, aber aus dem Gedächtnis hätte das so ausgesehen:
    Code:
    u  Ex.y
    fn Mx.y
    spbn ende
    
    L   0
    t    tmp_byte
    
    call sfc21
          srcblk : p#tmp_byte
          retval : tmp_int
          dstblk : p#db37.dbx0.0 byte 187 // die Adressen musst du natürlich anpassen
    
    ende : nop 0
    mfG Aventinus

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

    Standard

    Hab das jetzt mal von hucki so angepasst, CPU geht aber auf SF. Findet jemand meinen Fehler???

    Code:
          U     E    124.1
          FP    M     10.1
          SPBN  Neu
    
          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"                  // IN: BLOCK_DB
    
    // Zeiger inkrementieren
          L     MW    12                    // Zeiger für Ringpuffer (STATIC: INT)
          +     1
          T     MW    12                    // Zeiger für Ringpuffer
    
    // Zeiger auf Überlauf prüfen
          L     2000                        // maximale Anzahl an Datensätzen
          L     MW    12                    // Zeiger für Ringpuffer
          <=I   
          SPBN  oves
          L     0
    oves: T     MW    12                    // Zeiger für Ringpuffer
    
    
    
    // Ereigniszähler inkrementiern
          L     MW    16                    // Ereigniszähler  (STATIC: INT)
          +     1
          T     MW    16                    // Ereigniszähler
    
    // AR1 sichern                            
          TAR1                              // AR1 in Akku1 laden
          T     DBW   18                    // und im Temp sichern (im Forum so gelernt :), TEMP: DWORD )
    
    // Pointer erstellen
          L     MW    12                    // Zeiger für Ringpuffer
          L     8                           // Datensatzlänge (IN: INT,  Wert 8 über die Schnittstelle übergeben)
          *I    
          L     10                          // Startadresse des Datenfeldes (IN: INT,  Wert 10 über die Schnittstelle übergeben)
          +I    
          SLD   3                           // berechneten Wert auf die Byteadresse schieben
          LAR1                              // und ins Adressregister 1 schreiben
    
    // Daten eintragen
          L     MW    16                    // Ereigniszähler
          T     DBW [AR1,P#0.0]             // und wieder sichern
    
          L     "Uhrzeit".Aktuell_Stunden   // Aktuelle Stunde (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
          T     DBB [AR1,P#4.0]             // und in Ringpuffer sichern
    
          L     "Uhrzeit".Aktuell_Minuten   // Aktuelle Minute (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
          T     DBB [AR1,P#5.0]             // und in Ringpuffer sichern
    
          L     "Uhrzeit".Aktuell_Sekunden  // Aktuelle Sekunde (IN: STRUCT.INT, könnte man auch getrennt übergeben) laden
          T     DBB [AR1,P#6.0]             // und in Ringpuffer sichern
    
    // AR1 wiederherstellen                            
          L     DBW   18                    // Gesicherten Wert laden
          LAR1                              // und ins AR1 zurückschreiben
    
    
    
    
    // Register ggf. resetten
    Neu:  U     E    124.2                  // Öffner-Taster
          FN    M     11.2                  // deswegen negative Flanke
          SPBN  endf
    
    // AR1 sichern                            
          TAR1                              // AR1 in Akku1 laden
          T     DBW   18                    // und im Temp sichern
    
    // Zeiger initialisieren
          L     2000                        // maximale Anzahl an Datensätzen
          +     1                           // für Start um 1 erhöhen
    
    // Schleifenstart = Zeiger dekrementieren
    Next: +     -1                          // um 1 verringern
          T     MW    12                    // Zeiger für Ringpuffer speichern
    
    // Pointer erstellen
          L     MW    12                    // Zeiger für Ringpuffer
          L     8                           // Datensatzlänge
          *I    
          L     10                          // 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     MW    12                    // Zeiger für Ringpuffer laden
          LOOP  Next                        // Schleife wiederholen, bis Ringpuffer bei Null steht
    
    // AR1 wiederherstellen                            
          L     DBW   18                    // Gesicherten Wert laden
          LAR1                              // und ins AR1 zurückschreiben
    
    endf: NOP   0

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

    Standard

    Aventinus, ich hab halt hier immer das Problem dass ich Sachen nicht weiss die ich reinschreiben muss, z.B.:

    Code:
    u  Ex.y
    fn Mx.y
    spbn ende
    
    L   0
    t   tmp_byte
    
    call sfc21
          srcblk : p#tmp_byte
          retval : tmp_int
          dstblk : p#db37.dbx0.0 byte 187 // die Adressen musst du natürlich anpassen
    
    ende : nop 0

  5. #45
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Das mit dem DBW 18 für die Sicherung des AR ist nicht wirklich gut.
    Das kannst du zwar machen, wenn du in dem DB das DBW 18 dafür vorgesehen hast, aber wozu?
    Deklariere eine Temp, schreib das AR am Anfang des Bausteins dort hinein und am Ende restaurierst du es wieder, fertig.
    Dazu braucht es keine "quasi-statische" Variabe aus dem DB.

    Ansonsten: Hast du mal den Diagnosepuffer in der CPU angesehen? und ist der Db auch wirklich lang genug, stimmen alle deine Adressberechnungen und zeigen nicht über den DB hinaus?

    Geändert von Ralle (31.07.2013 um 10:49 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

  6. #46
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Code:
    // Pointer erstellen
          L     MW    12                    // Zeiger für Ringpuffer
          L     8                           // Datensatzlänge
          *I    
          L     10                          // Startadresse des Datenfeldes
          +I    
          SLD   3                           // berechneten Wert auf die Byteadresse schieben
          LAR1
    für MW 12 = 0 liegt dein Pointer auf 10
    für MW 12 = 1 liegt dein Pointer auf 18

    dein AR liegt in DBW 18, das wird also von Werten überschrieben.

    für MW 12 = 2000 liegt dein Pointer auf 16010, ist dein DB lang genug eingerichtet?
    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

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

    Standard

    Ahja, okay.
    Das erste verstehe ich noch, dass ich nicht DBW 18 nehmen soll, aber was soll/kann ich stattdessen nehmen (Was ist Temp, eine temporäre Variable wie z.b ein MW???) ?

    Mein Db sollte groß genung sein, er ist auch mit Abstand der Größte Baustein...
    Bausteine.jpg

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

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    für MW 12 = 2000 liegt dein Pointer auf 16010, ist dein DB lang genug eingerichtet?
    Ja, er ist 16016 lang

  9. #49
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Oben im Kopf des FC/FB kannst du Variablen deklarieren. Dort unter Temp legst du eine Variable AR1TEMP als DWORD an, diese nutzt du dann statt DBW18.

    TAR 1
    T #AR1Temp

    ...


    L #AR1Temp
    LAR 1
    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

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

    Minico89 (31.07.2013)

  11. #50
    Registriert seit
    13.10.2007
    Beiträge
    12.027
    Danke
    2.784
    Erhielt 3.268 Danke für 2.156 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Minico89 Beitrag anzeigen
    Ahja, okay.
    Das erste verstehe ich noch, dass ich nicht DBW 18 nehmen soll, aber was soll/kann ich stattdessen nehmen (Was ist Temp, eine temporäre Variable wie z.b ein MW???) ?

    Mein Db sollte groß genung sein, er ist auch mit Abstand der Größte Baustein...
    Bausteine.jpg
    Temp ist eine temponäre Baustein Variable und sollte nur
    im Deklarierten Baustein verwendet werden. Der Temponäre Speicherbereich
    wird auch von anderen Bausteinen verwendet und ist somit nicht für Statische
    Verwendung über die Bausteingrenzen geeignet.


    Der Merkerbereich ist eine Globale statische Variable.

  12. Folgender Benutzer sagt Danke zu rostiger Nagel für den nützlichen Beitrag:

    Minico89 (31.07.2013)

Ä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
  •