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

Seite 3 von 10 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 99

Thema: Mit Pointer in Ringregister schreiben

  1. #21
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Mist, da hab ich mich verkopiert. Wenn ich das recht sehe, schreibt er die Sekunden in die Variable für Stunden.

    Mit deiner Änderung sollten dann die Minuten in den Stunden stehen und die Sekunden in den Minuten.

    Dann müsstest du so anpassen:


    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     MW    12                    // Zeiger für Ringpuffer
          L     10                          // maximale Anzahl an Datensätzen
          >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     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
    mfG Aventinus

  2. Folgender Benutzer sagt Danke zu Aventinus für den nützlichen Beitrag:

    Minico89 (30.07.2013)

  3. #22
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard

    Zitat Zitat von Aventinus Beitrag anzeigen
    Code:
    // Zeiger auf Überlauf prüfen
          L     MW    12                    // Zeiger für Ringpuffer
          L     10                          // maximale Anzahl an Datensätzen
          >I    
          SPBN  over
          L     0
    over: T     MW    12                    // Zeiger für Ringpuffer
    An dieser (rot markierten) Stelle dürfte immer entweder die 0 (wenn der Sprung nicht ausgeführt wird) oder die 10 (wenn gesprungen wird) in das MW12 eingetragen werden.

    Das MW12 sollte also vor dem Sprung als Letztes in den Akku1 eingetragen werden (oder auch noch über den Transfer-Befehl springen):
    Code:
    // Zeiger auf Überlauf prüfen
          L     10                          // 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

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

    Minico89 (30.07.2013)

  5. #23
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Stimmt, da hab ich abweichend von meinem Standardkonstrukt inkrementieren und prüfen wegen der Übersichtilichkeit auseinandergenommen und promt verhauen.
    mfG Aventinus

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

    Standard

    Außerdem würde ich mir gar nicht erst angewöhnen, mit den MWs zu arbeiten.
    Für die beiden INT-Werte sowie die boolschen Werte für die Ereignisauslösung (und die DB-Angabe) ist doch bestimmt noch Platz in der Schnittstelle des Bausteins, oder?



    Ich find' es einfach nur furchtbar, das man das selbst in der Schule immer noch (? - auch schon wieder 5 Jahre her) als Erstes mit den MWs beigebracht bekommt.
    Wenn ich daran denke, wie lange ich gebraucht habe, um mir das wieder abzugewöhnen.
    Geändert von hucki (30.07.2013 um 11:37 Uhr)

  7. #25
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Gebe ich dir auch recht. Würde ich so auch nicht programmieren. Aber der TE wird das ja entprechend in seinem Programm umsetzen. Und mit den Merkern für die Flanken hatte er ja schon begonnen.

    Ich bin grundsätzlich gegen Merker, Datenbausteine, Bausteinnummern und absolute Adressen. Lokale und globale, symolische Variablen und gut ist.

    Aber den Schritt wollte Siemens ja auch mit TIA nicht mitgehen weil Merker gabs ja schon immer.
    mfG Aventinus

  8. #26
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard

    Das war auch eigentlich an den TE gerichtet. Sorry, dass ich das nicht richtig verdeutlicht habe.


    Ich denke schon, das Du weißt, wie Du Deine Bausteine vernünftig kapselst.



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

    Standard

    Zitat Zitat von Aventinus Beitrag anzeigen
    Mist, da hab ich mich verkopiert.

    Code:
    // Zeiger auf Überlauf prüfen
          L     MW    12                    // Zeiger für Ringpuffer
          L     10                          // maximale Anzahl an Datensätzen
          >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     8                           // Datensatzlänge
          *I
    Und nochmal verkopiert.


    Durch das Einfügen des Ereigniszählers rechnet jetzt der Pointer mit dem MW14 und nicht mehr mit dem MW12.
    Also entweder den Ereigniszähler weiter nach vorn verschieben oder noch einmal Laden einfügen:
    Code:
    // Daten eintragen
          L     MW    12                    // Zeiger für Ringpuffer
          L     8                           // Datensatzlänge
          *I


    Bzw. dann nur lokal (ungetestete Vorlage von Aventinus):
    Code:
          U     #Ausloesung                 // IN: BOOL
          FP    #FM_Ausloesung              // STATIC: BOOL
          SPBN  ende
    
          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     10                          // 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  (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     #Datensatzlaenge            // Datensatzlänge (IN: INT,  Wert 8 über die Schnittstelle übergeben)
          *I    
          L     #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 AR1-Wert laden
          LAR1                              // und ins AR1 zurückschreiben
    
    ende: NOP   0
    Ich hoffe, ich hab' nichts übersehen.
    Geändert von hucki (30.07.2013 um 13:01 Uhr) Grund: optisches Feintuning

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

    Aventinus (30.07.2013)

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

    Standard

    Ich habe hier grade einen Vertreter/Programmierer von Siemens sitzen, der hat mir ne CD gegeben mit Hilfen und Anleitungen die es so nicht im Internet gibt und auch nur gegen teuer Geld an Hochschulen verkauft wird

  12. #29
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Na dann brauchst du uns ja fast nicht mehr
    mfG Aventinus

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Doch, der hat keine Zeit für mich

    Hab den Code jetzt genommen und es ging für ein paar Einträge, danach haben auf einmal die Stunden und Minuten gefehlt, dann ein paar Einträge später die Sekunden und daraufhin dann die aufgenommenen Flanken...

    Ich glaub ich feuer die CPU gleich ausm Fenster

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