Step 7 Mit Pointer in Ringregister schreiben

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     DB[COLOR=#ff0000]B[/COLOR] [AR1,P#[COLOR=#ff0000]4[/COLOR].0]             // und in Ringpuffer sichern

      L     #Temp_akt_m                 // Aktuelle Minute laden
      T     DB[COLOR=#ff0000]B[/COLOR] [AR1,P#[COLOR=#ff0000]5[/COLOR].0]             // und in Ringpuffer sichern

      L     #Temp_akt_s                 // Aktuelle Sekunde laden
      T     DB[COLOR=#ff0000]B[/COLOR] [AR1,P#[COLOR=#ff0000]6[/COLOR].0]             // und in Ringpuffer sichern

ende: NOP   0
 
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: [COLOR=#FF0000]T     MW    12 [/COLOR]                   // 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:
[FONT=Courier New]// Zeiger auf Überlauf prüfen
      L     10                          // maximale Anzahl an Datensätzen
      L     MW    12                    // Zeiger für Ringpuffer
      [COLOR=#FFA500]<=[/COLOR]I    
      SPBN  over
      L     0
over: T     MW    12                    // Zeiger für Ringpuffer[/FONT]
 
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.
:sm12:
 
Zuletzt bearbeitet:
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
;)

:ROFLMAO:
 
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


[COLOR=#FF8C00]// Ereigniszähler inkrementiern
      L     MW    14                    // Ereigniszähler
      +     1
      T     MW    14                    // Ereigniszähler[/COLOR]

// 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
      [COLOR=#00FF00]L     MW    12[/COLOR]                    // Zeiger für Ringpuffer
      L     8                           // Datensatzlänge
      *I



Bzw. dann nur lokal (ungetestete Vorlage von Aventinus):
Code:
[FONT=Courier New]      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

[/FONT][FONT=Courier New]// Daten eintragen[/FONT]
[FONT=Courier New]      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[/FONT][FONT=Courier New], könnte man auch getrennt übergeben[/FONT][FONT=Courier New]) laden
      T     DBB [AR1,P#5.0]             // und in Ringpuffer sichern

      L     #Uhrzeit.Aktuell_Sekunden   // Aktuelle Sekunde (IN: STRUCT.INT[/FONT][FONT=Courier New], könnte man auch getrennt übergeben[/FONT][FONT=Courier New]) 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[/FONT]
Ich hoffe, ich hab' nichts übersehen. :cool:
 
Zuletzt bearbeitet:
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 :smile:
 
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 :sm17:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mach das nicht, die war ja teuer.

ich würde das ganze nochmal zurücksetzen und analysieren.

1. Zählt der Ereigniszähler bei jeder Flanke weiter? Wenn ja passen auch die Flanken.
2. Läuft die aktuelle Uhrzeit sauber?
3. Sichere dir das Adressregister nach LAR1 mal in ein MD oder in einen DB, damit du prüfen kannst ob das sauber berechnet wird. Bei der ersten Flanke müsste P#10.0 beim 2. P#18.0 beim 3. P#26.0 usw. drinstehen.
4. Was macht das Adressregister nach dem ersten Durchlauf des Ringpuffers?
 
Es tut mir wirklich leid für deinen Extraaufwand Aventinus, aber es geht!!!!! :!: :!: :!:

Kann ich über einen Öffner Taster "E 124.2" eine Flanke abfangen und damit das ganze "Register (DB3)" wieder zurücksetzen, quasi nullen?
 
Vielen Dank, aber ich verstehe wie üblich nur wieder Bahnhof! Wenn ich euren Code sehe verstehe ich ihn fast immer, bin aber NOCH nicht in der Lage ihn selbst zu erzeugen...
Würdest du nochmal Codemäßig was schreiben bitte :sm8:
 
Zurück
Oben